当前位置:网站首页>修饰模式和代理模式的异同

修饰模式和代理模式的异同

2022-06-13 09:25:00 edui

  • 修饰模式和代理模式的异同

对装饰器模式来说,装饰者(Decorator)和被装饰者(Decoratee)都实现一个接口。对代理模式来说,代理类(Proxy Class)和真实处理的类(Real Class)都实现同一个接口。此外,不论我们使用哪一个模式,都可以很容易地在真实对象的方法前面或者后面加上自定义的方法。
不同点在于代理模式是直接编写一个代理类实现相同的接口,真实类被隐藏,修饰模式则是需要传入一个人被修饰类,不被隐藏,可以用一个类送去给多个修饰类去修饰
从思路上讲,代理模式是强调访问控制辅组什么的功能,修饰模式是增强功能的动态的,动态就是说修饰模式是对被修饰类的增强可以选择多个不同的修饰类,传入被修饰的对象岂可。代理对象用的是自己创造的被代理对象类,进行代替工作,而修饰类则是用的参数传过来的修饰对象对其进行增强功能增加额外功能,执行的时候代理类直接执行,外界来看是不知道被代理类的存在的,而修饰类执行需要传入被代理对象,执行的还是被代理的对象使用者需要传入被修饰的对象所以知道被修饰者的存在并且修饰不对原来的对象产生影响。

主要区分点还是对于需要加功能的对象的来源,是在实现的类内部创造还是传入,即对使用加功能类来说被加功能类是否需要自己操心的关心来源的。
参考文章《装饰器模式和代理模式的区别

  • 上代码感悟
    基础类
    点咖啡
public interface Coffee {
    
    /** * 打印当前咖啡里有什么 */
    void printMaterial();
}

public class BitterCoffee implements Coffee {
    
    @Override
    public void printMaterial() {
    
        System.out.println("咖啡");
    }
}

@Test
public void orderCoffee {
    
    Coffee coffee = new BitterCoffee();
    coffee.printMaterial(); // 咖啡
}

你喝了一口咖啡,觉得有点苦,于是你就想加点糖。

定义一个咖啡装饰器(加糖)。

public class CoffeeDecorator implements Coffee {
    
    /** * 持有一个咖啡对象 */
    private final Coffee coffee;

    public CoffeeDecorator(Coffee coffee) {
    
        this.coffee = coffee;
    }

    @Override
    public void printMaterial() {
    
        System.out.println("糖");
        this.coffee.printMaterial();
    }
}

@Test
public void addSugerIntoCoffee {
    
    Coffee coffee = new BitterCoffee(); // 点了一杯苦咖啡
    coffee = new SugarDecorator(coffee); // 给咖啡加了点糖
    coffee.printMaterial(); // 糖 咖啡
}

约好的朋友来了,要给她点一杯咖啡,你知道咖啡很苦,决定直接点一杯加了糖的咖啡给她。

定义一个加糖咖啡的类(代理点咖啡这个行为)。

public class CoffeeProxy implements Coffee {
    
    private final Coffee coffee;

    public CoffeeProxy() {
    
        this.coffee = new BitterCoffee();
    }

    @Override
    public void printMaterial() {
    
        System.out.println("糖");
        this.coffee.printMaterial();
    }
}

@Test
public void addSugerIntoCoffee {
    
    Coffee coffee = new CoffeeProxy();
    coffee.printMaterial(); // 糖 咖啡
}
原网站

版权声明
本文为[edui]所创,转载请带上原文链接,感谢
https://blog.csdn.net/I_am_hardy/article/details/93467774