JAVA设计模式-代理模式和装饰器(者)模式的区别

介绍

两者写法相似,但实现的功能有些区别:

  • 装饰,侧重对类的功能扩展,即:扩展其他方法

  • 代理,侧重对类原方法的增强。没有 扩展其他方法

例子

定义接口

定义 IChild 接口,该接口有 eat() 方法

public interface IChild {

    void eat();
}

创建实现类

创建 Child 类,实现该接口:

public class Child implements IChild{

    @Override
    public void eat() {

        Log.e("TAG","孩子吃饭");
    }
}

提出问题

由于孩子太小,不会自己吃饭,需要妈妈喂饭才能吃饭

分析

该需求 不需要增加新方法,只是 对原方法进行增强,所以通过 代理模式 解决

解决 (代理模式)

创建父母(代理)类:

public class Parent implements IChild{

    private Child child;

    private Parent(Child child){

        this.child = child;
    }

    @Override
    public void eat() {

        System.out.println("妈妈喂饭");
        child.eat();
        System.out.println("妈妈给擦嘴");
    }
}

提出新需求

孩子长大了,还要学习

分析

该需求明显是 需要增加新方法,所以通过 装饰器模式 解决

创建孩子扩展(装饰)类:

public class ChildWrapper implements IChild{

    private Child child;

    public ChildWrapper(Child child){

        this.child = child;
    }

    public void study(String s) {

        System.out.println("学习"+s);
    }
}

总结

  • 装饰,增加其他方法

  • 代理,对类原方法的之前、之后增加额外代码。没有 增加其他方法

参考:
https://www.jianshu.com/p/c06a686dae39


原文出处:https://malaoshi.top/show_1IX4uMVW7BQj.html