代理模式是一种很常用的设计模式,其目的是对其他对象提供一种代理以控制对这个对象的访问。
代理模式又分为静态代理和动态代理,静态代理是在程序运行之前就已经存在了代理类,动态代理是程序运行中在内存中生成代理类。
代理模式存在的意义:代理模式是为了解决滥用继承的问题而生的,当想对某个类的功能进行扩充的时候可以使用继承或聚合,很明显用继承的话会造成类泛滥,还有一点就是继承是类具有很强的层级关系的情况下用才好,而紧紧对某个类进行功能的扩充就拿起继承的大刀明显的不合适,那么用聚合呢?聚合是一种松耦合的,用聚合创建的代理类就是静态代理,还有更好的代理是动态代理。
动态代理自己实现其实也很简单,不过JDK提供了方便的解决方案。
java.lang.reflect.InvocationHandler
java.lang.reflect.Proxy
这两个东东就是为动态代理而生的
package design.proxy.hello;
/**
* @author 作者 E-mail: jqsl2012@163.com
* @version 创建时间:2012-2-2 下午03:57:56 <br>
*/
public interface Hello {
void say();
}
package design.proxy.hello;
/**
* @author 作者 E-mail: jqsl2012@163.com
* @version 创建时间:2012-2-2 下午03:58:10 <br>
* 被代理的类
*/
public class HelloImpl implements Hello {
public void say() {
System.out.println("say");
}
}
package design.proxy.hello;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author 作者 E-mail: jqsl2012@163.com
* @version 创建时间:2012-2-2 下午03:54:45 <br>
* 动态代理
*/
public class HelloProxy {
public static Object newProxyInstance(final Object target) {
InvocationHandler h = new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
before();
Object result = method.invoke(target, args);
after();
return result;
}
};
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), h);
}
private static void before() {
System.out.println("before");
}
private static void after() {
System.out.println("after");
}
}
package design.proxy.hello;
/**
* @author 作者 E-mail: jqsl2012@163.com
* @version 创建时间:2012-2-2 下午03:57:44 <br>
*
*/
public class Test {
public static void main(String[] args) {
/*
* 代理模式
*/
Hello proxy = (Hello) HelloProxy.newProxyInstance(new HelloImpl());
proxy.say();
}
}
-----------------------------分割线----------------------------------
上面是代理模式,其实装饰模式和代理模式极为相似
相同点:都是为被代理(被装饰)的类扩充新的功能。
不同点:代理模式具有控制被代理类的访问等性质,而装饰模式紧紧是单纯的扩充被装饰的类。所以区别紧紧在是否对被代理/被装饰的类进行了控制而已。
package design.staticProxy;
/**
* @author 作者 E-mail: jqsl2012@163.com
* @version 创建时间:2012-2-3 下午10:10:43 <br>
*/
public interface InputStream {
void read();
}
package design.staticProxy;
/**
* @author 作者 E-mail: jqsl2012@163.com
* @version 创建时间:2012-2-3 下午10:11:16 <br>
*/
public class FileInputStream implements InputStream{
public void read() {
System.out.println("FileInputStream.read");
}
}
package design.staticProxy;
/**
* @author 作者 E-mail: jqsl2012@163.com
* @version 创建时间:2012-2-3 下午10:11:50 <br>
* 代理/装饰类具有和被代理/被装饰的类相同的接口
*/
public class BufferedInputStream implements InputStream {
protected InputStream in;
public BufferedInputStream(InputStream in) {
this.in = in;
}
public void read() {
//加入控制代码就是代理,否则单纯的扩充功能就是装饰模式
if(true){
System.out.println("BufferedInputStream.read");
}
this.in.read();
}
}
package design.staticProxy;
/**
* @author 作者 E-mail: jqsl2012@163.com
* @version 创建时间:2012-2-3 下午10:13:20 <br>
*/
public class Test {
public static void main(String[] args) {
BufferedInputStream buffIn = new BufferedInputStream(new FileInputStream());
buffIn.read();
}
}
很明显,装饰模式和静态代理极为相似。设计模式里面有许多模式都看起来很相似,要区分估计得从目的上去区分了。
- 大小: 59 KB
分享到:
相关推荐
pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/structure/...
pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/structure/...
pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/structure/...
pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/structure/...
pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/...
pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/...
pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/...
pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/...
pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/structure/...
pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/structure/...
pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/...
装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型: 13. 模板方法(Template Method) 14. 命令...
2、代理模式PROXY PATTERN 3、单例模式SINGLETON PATTERN 4、多例模式MULTITION PATTERN 5、工厂方法模式FACTORY METHOD PATTERN 6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式FACADE PATTERN 8、适配器...
Decorator ( 装饰模式 ) Facade ( 外观模式 ) Flyweight ( 享元模式 ) Proxy ( 代理模式 ) Chain of Responsibility ( 责任链模式 ) Command ( 命令模式 ) Interpreter ( 解释器模式 ) Iterator ( 迭代器模式...
备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单例模式(Singleton Pattern) 迭代器模式(Iterator Pattern) 访问者模式(Visitor ...
代理模式(Proxy) 行为型: 责任链模式(Chain of Responsibility) 命令模式(Command) 解释器模式(Interpreter) 迭代器模式(Iterator) 中介者模式(Mediator) 备忘录模式(Memento) 观察者模式(Observer) 状态模式...
代理模式(Proxy Pattern) 3. 行为型模式 责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter Pattern) 迭代器模式(Iterator Pattern) 中介者模式...
装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板方法(Template Method) 14. 命令...
代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( Template Method ) 观察者模式( ...
代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( Template Method ) 观察者模式( ...