1.静态工厂和抽象工厂的相同点和不同点.(网上搜过没找到答案)
2.并发操作为什么不用库的形式提供?(这题记得不是很清楚)
3.(设计模式)拦截器、代理、适配器这几种模式,我没见过,以前看的设计模式名称全是英文,如果有这几种模式,描述出他们的相同点和不同点.
4.javascript里的this和java里的this区别.
2.并发操作为什么不用库的形式提供?(这题记得不是很清楚)
3.(设计模式)拦截器、代理、适配器这几种模式,我没见过,以前看的设计模式名称全是英文,如果有这几种模式,描述出他们的相同点和不同点.
4.javascript里的this和java里的this区别.
不过使用方式不一样javascript 的 this
<a href="#" onclick="alert(this.href)">aaa</a>java 的 this
本对象操作符public class Bean{
public int count = 0;
public Bean(){
this.count = 1;
}
}
1. 意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2. 别名
K i t
3. 动机
考虑一个支持多种视感( l o o k - a n d - f e e l)标准的用户界面工具包,例如M o t i f和
Presentation Manager。不同的视感风格为诸如滚动条、窗口和按钮等用户界面“窗口组件”
定义不同的外观和行为。为保证视感风格标准间的可移植性,一个应用不应该为一个特定的
视感外观硬编码它的窗口组件。在整个应用中实例化特定视感风格的窗口组件类将使得以后
很难改变视感风格。
4. 适用性
在以下情况可以使用Abstract Factory模式
• 一个系统要独立于它的产品的创建、组合和表示时。
• 一个系统要由多个产品系列中的一个来配置时。
• 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
• 当你提供一个产品类库,而只想显示它们的接口而不是实现拦截器:
拦截器是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法
比如动态代理就是拦截器的简单实现,
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
Object result = null; System.out.println("before invoke method :" + method.getName()); result = method.invoke(this.targetObj, args); System.out.println("after invoke method : " + method.getName()); return result;
}
在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,
甚至在你抛出异常的时候做业务逻辑的操作。
代理
在目前的Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。 其实现主要通过是java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。 Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现,如下,HelloWorld接口定义的业务方法,HelloWorldImpl是HelloWorld接口的实现,HelloWorldHandler是 InvocationHandler接口实现。代码如下: 业务接口: public interface HelloWorld {
void sayHelloWorld() ; } 业务接口实现: public class HelloWorldImpl implements HelloWorld {
public void sayHelloWorld() { System.out.println("Hello World!"); } } InvocationHandler实现,需要在接口方法调用前后加入一部份处理工作,这里仅仅在方法调用前后向后台输出两句字符串,其代码如下: import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class HelloWorldHandler implements InvocationHandler { //要代理的原始对象 private Object objOriginal; /** * 构造函数。 * @param obj 要代理的原始对象。 */ public HelloWorldHandler(Object obj) { this.objOriginal = obj ; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result ; //方法调用之前 doBefore(); //调用原始对象的方法 result = method.invoke(this.objOriginal ,args); //方法调用之后 doAfter(); return result ; } private void doBefore() { System.out.println("before method invoke!"); } private void doAfter() { System.out.println("after method invoke!"); } } 测试代码: import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { HelloWorld hw = new HelloWorldImpl(); InvocationHandler handler = new HelloWorldHandler(hw); HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance( hw.getClass().getClassLoader(), hw.getClass().getInterfaces(), handler); proxy.sayHelloWorld(); } } Ø 首先获取一个业务接口的实现对象; Ø 获取一个InvocationHandler实现,此处是HelloWorldHandler对象; Ø 创建动态代理对象; Ø 通过动态代理对象调用sayHelloWorld()方法,此时会在原始对象HelloWorldImpl. sayHelloWorld()方法前后输出两句字符串。 运行测试类输出如下: before method invoke! Hello World! after method invoke! 此处Test类中的方法调用代码比较多,在我们的实际应用中可以通过配置文件来来简化客户端的调用实现。另外也可以通过动态代理来实现简单的AOP。
http://www.leadbbs.com/MINI/Default.asp?230-2476757-0-0-0-0-0-a-.htm
JAVA THIS详解
http://www.mscto.com/Java/200811151560_3.html
将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适用环境
你想使用一个已经存在的类,而它的接口不符合你的需求。
你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
Proxy(代理模式)
为其他对象提供一种代理以控制对这个对象的访问。
适用环境
在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用Proxy模式。下面是一些可以使用Proxy模式常见情况:
远程代理(Remote Proxy )为一个对象在不同的地址空间提供局部代表。
虚代理(Virtual Proxy )根据需要创建开销很大的对象。
保护代理(Protection Proxy )控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
)智能指引(Smart Reference )取代了简单的指针,它在访问对象时执行一些附加操作。
它的典型用途包括:
对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它。
当第一次引用一个持久对象时,将它装入内存。
在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。
其实这两者的区别,GOF的书上说得很清楚。静态工厂方法采用的是类继承机制(生成一个子类,重写该工厂方法,在该方法中生产一个对象)。而抽象工厂采用的是对象组合机制,专门定义“工厂”对象来负责对象的创建。对象组合的方式就是把“工厂”对象作为参数传递。形象的说:抽象工厂模式关键在于工厂类是多层次的,有父工厂类和子工厂类,父工厂类可以产生子工厂类,再由子工厂类生产出产品,这样产品也可以是由复杂关系的,也可以说多种的。静态工厂方法模式,讲的是由一个方法,可以产生不同的但是同类的(或者同接口的)产品。静态工厂方法模式就能满足一般的需要。复杂情况下才用抽象工厂模式。
见java.util.concurrent
简单讲,三者都是利用中间对象来增强对象功能的模式,不同在于其目的不一样。楼主可以细读GOF设计模式或者阎宏的java与模式,自己总结。
在javascript中,this 对象 返回“当前”对象。在不同的地方,this 代表不同的对象。如果在 JavaScript 的“主程序”中(不在任何 function 中,不在任何事件处理程序中)使用 this,它就代表 window 对象;如果在 with 语句块中使用 this,它就代表 with 所指定的对象;如果在事件处理程序中使用 this,它就代表发生事件的对象。
在Java中,一般指当前类对象