装饰器模式(Decorator)和代理模式(Proxy)
来源:互联网 发布:淘宝日本代购退换 编辑:程序博客网 时间:2024/06/18 16:21
装饰器模式(Decorator)和静态代理模式(Proxy)实现的方式和类图很相似。容易混淆分辨不清。
装饰器模式(Decorator)
使用场景:动态地给一个对象添加一些额外的职责。就增加功能来说, decorator模式相比生成子类更为灵活
代理模式(Proxy)
使用场景:为其他对象提供一种代理以控制对这个对象的访问。
两种模式的特点:
1,装饰类和被装饰类(代理类和被代理类)都是实现共同的接口。类图结构大体相同。
2,都是通过装饰类(代理类)访问被装饰的类(被代理的类)。
3,但是两者的注重的方向不一样,装饰器模式突出给原有类增加新功能。而代理类是强调被代理类的访问(保护被代理的对象)。
类图:
从类图可以看出来 代理模式中Proxy的构造函数中创建类Source对象 ,而装饰器模式中Decorator类的构造函数Source是以参数传入进来的。
装饰器模式代码
/** * Created by lyy on 17-7-12. * 实现接口 */public interface Sourceable { void method();}
public class Source implements Sourceable { @Override public void method() { System.out.println("source method"); }}
public class Decorator implements Sourceable { public Sourceable source; public Decorator(Sourceable source){ this.source = source; } @Override public void method() { System.out.println("start decorator method"); this.source.method(); System.out.println("end decorator method"); }}
public class DecoratorTest { public static void main(String[] args) { //被装饰类 Sourceable source = new Source(); //装饰类s Sourceable sourceable = new Decorator(source); sourceable.method(); }}
代理模式代码
public interface Sourceable { void method();}
public class Source implements Sourceable { @Override public void method() { System.out.println("source method"); }}
public class Proxy implements Sourceable { private Source source; public Proxy(){ this.source = new Source(); } @Override public void method() { System.out.println("start-----------"); source.method(); System.out.println("end-----------"); }}
public class ProxyTest { public static void main(String[] args) { Sourceable sourceable = new Proxy(); sourceable.method(); }}
网站上的一些其他理解:
1.装饰模式:对被装饰的对象增加额外的职责,满足里氏代换原则(子类可以代替父类)
如:杯子生产线,杯子必须可以装水,在生产线上可以给杯子涂颜色,加杯盖,但要保证杯子可以装水。
2.代理模式:对被代理的对象提供访问控制。
如:客户订购商品,可以直接从厂家订购,也可以从网上商城订购,网上商城是厂家的代理,从网上商城订购商品,商城可以对商品进行控制,不交钱不给商品,人不在不给商品,也可以赠送你额外的礼品,代金券。
装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案;
代理模式给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用;
装饰模式应该为所装饰的对象增强功能;
代理模式对代理的对象施加控制,并不提供对象本身的增强功能
二者的实现机制确实是一样的,可以看到他们的实例代码重复是很多的。但就语义上说,这两者的功能是相反的,模式的一个重要作用是简化其他程序员对你程序的理解,
你在一个地方写装饰,大家就知道这是在增加功能,你写代理,大家就知道是在限制。
- 装饰器模式(Decorator)和代理模式(Proxy)
- 装饰模式(Decorator)和代理模式(Proxy)
- [设计模式](六):装饰器模式(Decorator)和代理模式(Proxy)|委托模式(Delegater )
- 设计模式(5)-代理(Proxy)模式和装饰(Decorator)模式
- 我的设计模式-装饰(Decorator)、代理(Proxy)
- Java编程开发设计模式之--装饰者模式(Decorator)与代理模式(Proxy)
- 装饰模式(Decorator)与代理模式(Proxy)的区别与联系
- 装饰器(Decorator)模式
- 装饰器(Decorator)模式
- 装饰器(Decorator)模式
- 装饰器(Decorator)模式
- 装饰器模式(Decorator)
- 装饰器(Decorator)模式
- 装饰器(Decorator)模式
- 装饰器模式 decorator
- Decorator 装饰器模式
- 装饰器模式(Decorator)
- 装饰器模式(Decorator)
- JS的类型转换,强制转换和隐式转换
- struts2学习笔记(二)---实例应用
- HDU6153-A Secret
- 新朋实验室之玩具遥控车改装为ARDUINO蓝牙遥控小车(代码及制作过程开源)
- Monitorix-免费开源的单机Linux监控工具
- 装饰器模式(Decorator)和代理模式(Proxy)
- UVa 10213
- python 使用ConfigParser解析&修改配置文件
- c++常用知识点3
- Hadoop伪分布模式配置
- R桑基图
- android系统裁剪方法
- skynet源码分析(8)--skynet的网络
- VMWare启动centos 7时报内部错误