设计模式---代理模式与装饰者模式

目录

 

一、代理模式与装饰者模式对比

二、代理模式

三、装饰器模式


一、代理模式与装饰者模式对比

这两个设计模式看起来很像。对装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一个接口。对代理模式来说,代理类(proxy class)和真实处理的类(real class)都实现同一个接口。此外,不论我们使用哪一个模式,都可以很容易地在真实对象的方法前面或者后面加上自定义的方法。
我们可以用另外一句话来总结这些差别:

1、使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。
2、代理模式中的实例是在其构造方法中new的;而装饰者模式则是通过构造器参数传递进去的;

代理模式与装饰者模式看起来很像,都实现基础对象实现的接口,在其自身对象中都保存着对被代理/被装饰者的对象引用。
装饰者模式的定义:动态的将责任附加到被装饰者对象上,用于扩展对象的功能。比继承的灵活性大。典型的如Java IO的设计即是装饰者模式的典型应用。
代理模式模式的定义:对其他对象进行代理,以控制对被代理对象的访问。spring的为业务逻辑层方法生成的代理类,主要进行一些事务控制等。aop

装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案;
由定义可以看出装饰的责任是:扩展功能 ,而代理主要控制访问

二、代理模式

//代理模式
public class Proxy implements Subject{

       private Subject subject;
       public Proxy(){
             //关系在编译时确定
            subject = new RealSubject();
       }
       public void doAction(){
             ….
             subject.doAction();
             ….
       }
}
//代理的客户
public class Client{
        public static void main(String[] args){
             //客户不知道代理委托了另一个对象
             Subject subject = new Proxy();
             …
        }
}
 

三、装饰器模式

//装饰器模式
public class Decorator implements Component{
        private Component component;
        public Decorator(Component component){
            this.component = component
        }

       public void operation(){
            ….
            component.operation();
            ….
       }
}
//装饰器的客户
public class Client{
        public static void main(String[] args){
            //客户指定了装饰者需要装饰的是哪一个类
            Component component = new Decorator(new ConcreteComponent());
            …
        }
}
 

猜你喜欢

转载自blog.csdn.net/l1394049664/article/details/81610430