装饰器模式(Decorator)和代理模式(Proxy)

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

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

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值