java设计模式-代理模式和装饰者模式的区别


代理模式

定义

为其他对象提供一种代理以控制对这个对象的访问。代理模式(Proxy Pattern)是GoF 23Java常用设计模式之一。代理模式的定义:Provide a surrogate or placeholder for another object to controlaccess to it(为其他对象提供一种代理以控制对这个对象的访问)。使用代理模式创建代理对象,让 代理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能。

UML类图

实例

//接口
public interface Subject {
    void operaion();
}
//真实类
public class RealSubject implements Subject{
    @Override
    public void operaion() {
            System.out.println("real subject operation");
    }
}
//代理类,依赖真实类,并且这个关系实在编译的时候确立的
public class Proxy implements  Subject{
    @Override
    public void operaion() {
        RealSubject realSubject = new RealSubject();
        //AOP
        System.out.println("begin realsubject");
        realSubject.operaion();;
        System.out.println("end realSubject");
    }
}
//客户端
public class Client {
    public static void main(String args[]){
        Subject proxy = new Proxy();
        proxy.operaion();
    }
}

代理模式和装饰者模式的区别

定义上区别

装饰模式:以对 客户端透明(客户端需要指明装饰的是哪个类)的方式 扩展对象的功能,是继承关系的一个替代方案; 代理模式:给一个对象提供一个代理对象,客户端是不 透明的(客户端不需要指定代理的是那个类,这个关系式在编译达时候确定了的),并有代理对象来控制对原有对象的引用);

代码上区别

参考:装饰者模式

//代理模式,在代理类中,需要代理的是一个类

public void operaion() { RealSubject realSubject = new RealSubject(); //AOP System.out.println("begin realsubject"); realSubject.operaion();; System.out.println("end realSubject"); }

//装饰者模式,在装饰者模式中,客户端需要指明装饰的是哪一个对象, //去给这个对象进行增加功能

public Component component; public ConcreteDecorator(Component component){ this.component = component; } public void operation() { component.operation(); System.out.println(this.getClass().getName()+":operat"); }

nemotan /
Published under (CC) BY-NC-SA in categories 设计模式  tagged with 设计模式