代理模式是一种很常用的设计模式,其目的是对其他对象提供一种代理以控制对这个对象的访问。
代理模式又分为静态代理和动态代理,静态代理是在程序运行之前就已经存在了代理类,动态代理是程序运行中在内存中生成代理类。
代理模式存在的意义:代理模式是为了解决滥用继承的问题而生的,当想对某个类的功能进行扩充的时候可以使用继承或聚合,很明显用继承的话会造成类泛滥,还有一点就是继承是类具有很强的层级关系的情况下用才好,而紧紧对某个类进行功能的扩充就拿起继承的大刀明显的不合适,那么用聚合呢?聚合是一种松耦合的,用聚合创建的代理类就是静态代理,还有更好的代理是动态代理。
动态代理自己实现其实也很简单,不过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/...
本资料主要探讨的是代理模式(Proxy Pattern)和装饰模式(Decorator Pattern)在Ruby中的实现,通过具体的代码实例,帮助开发者理解和运用这两种模式。 **代理模式**是一种结构型设计模式,它创建了一个拥有与目标...
装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型: 13. 模板方法(Template Method) 14. 命令...
包括适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、组合模式(Composite)和代理模式(Proxy)。 3. **行为型模式**(Behavioral Patterns):...
2、代理模式PROXY PATTERN 3、单例模式SINGLETON PATTERN 4、多例模式MULTITION PATTERN 5、工厂方法模式FACTORY METHOD PATTERN 6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式FACADE PATTERN 8、适配器...
以 Jive 为例,剖析代理模式在用户级别授权机制上的应用 设计模式之 Facade(门面?) 可扩展的使用 JDBC针对不同的数据库编程,Facade提供了一种灵活的实现. 设计模式之 Composite(组合) 就是将类用树形结构组合成...
其中包括适配器模式(Adapter)、桥接模式(Bridge)、装饰器模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、组合模式(Composite)和代理模式(Proxy)。这些模式帮助我们更好地组织代码,提高...
2. 结构型模式:适配器(Adapter)、桥接(Bridge)、装饰(Decorator)、外观(Facade)、组合(Composite)、享元(Flyweight)和代理(Proxy)。这些模式主要处理对象之间的关系,使得不同组件能够以一致的方式...
结构型模式如适配器(Adapter)、装饰器(Decorator)、代理(Proxy)等,关注如何组合不同的组件来构建复杂系统。行为型模式如策略(Strategy)、观察者(Observer)、命令(Command)等,它们处理对象之间的交互和...