装饰器模式(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.代理模式:对被代理的对象提供访问控制。
如:客户订购商品,可以直接从厂家订购,也可以从网上商城订购,网上商城是厂家的代理,从网上商城订购商品,商城可以对商品进行控制,不交钱不给商品,人不在不给商品,也可以赠送你额外的礼品,代金券。

装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案;
代理模式给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用;
装饰模式应该为所装饰的对象增强功能;
代理模式对代理的对象施加控制,并不提供对象本身的增强功能

二者的实现机制确实是一样的,可以看到他们的实例代码重复是很多的。但就语义上说,这两者的功能是相反的,模式的一个重要作用是简化其他程序员对你程序的理解,
你在一个地方写装饰,大家就知道这是在增加功能,你写代理,大家就知道是在限制。




原创粉丝点击