[java] 23种设计模式之装饰者模式

时间:2024-04-17 18:14:24

1.1 装饰者模式的概念

​ 1、在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

​ 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。装饰对象可以在转发这些请求以前或以后增加一些附加功能

1.2 应用场景

比如我们去买一个肉夹馍,你可以选择加生菜、鸡蛋、鸡柳、香肠等等,一个肉夹馍加上不同的配料价格是不同的,那么我们如何去计算价钱呢?

   (1)抽象组件(Component)角色:给出一个抽象类,以规范准备接收附加功能的对象。

(2)具体组件(Concrete Component)角色:定义一个将要接收附加功能的类。
(3)装饰(Decorator)角色:持有一个组件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
(4)具体装饰(Concrete Decorator)角色:负责给组件对象添加上附加的功能。

1.3 肉夹馍实例

抽象组件(Component)角色:首先我们是定义一个抽象类ShouZhuaBingInterface,同时定义好基础的功能:

public interface ShouZhuaBingInterface {
    /**
     * 描述
     *
     * @return
     */
    public String getDesc();

    /**
     * 手抓饼价格
     *
     * @return
     */
    public int getPrice();
}

具体组件(Concrete Component)角色:定义一个被装饰的类,实现ShouZhuaBingInterface接口,并实现具体功能:

public class ShouZhuaBing implements ShouZhuaBingInterface{
    @Override
    public String getDesc() {
        return "手抓饼";
    }

    @Override
    public int getPrice() {
        return 5;
    }
}

装饰(Decorator)角色:定义一个装饰抽象类Deractor,实现ShouZhuaBingInterface接口,并拥有一个ShouZhuaBingInterface实例:

public abstract class Deractor implements ShouZhuaBingInterface {
    private ShouZhuaBingInterface shouZhuaBingInterface;

    public Deractor(ShouZhuaBingInterface shouZhuaBingInterface) {
        this.shouZhuaBingInterface = shouZhuaBingInterface;
    }

    @Override
    public String getDesc() {
        return shouZhuaBingInterface.getDesc();
    }

    @Override
    public int getPrice() {
        return shouZhuaBingInterface.getPrice();
    }
}

具体装饰(Concrete Decorator)角色:定义具体装饰类,继承装饰抽象类Deractor,并在其中扩展具体组件角色的功能:

鸡蛋装饰:

public class EggDeractor extends Deractor {
    public EggDeractor(ShouZhuaBingInterface shouZhuaBingInterface) {
        super(shouZhuaBingInterface);
    }

    @Override
    public String getDesc() {
        String desc = "鸡蛋" + super.getDesc();
        return desc;
    }

    @Override
    public int getPrice() {
        int price = 2 + super.getPrice();
        return price;
    }
}

香肠装饰:

public class SausageDeractor extends Deractor {
    public SausageDeractor(ShouZhuaBingInterface shouZhuaBingInterface) {
        super(shouZhuaBingInterface);
    }

    @Override
    public String getDesc() {
        return "香肠" + super.getDesc();
    }

    @Override
    public int getPrice() {
        return 5 + super.getPrice();
    }
}

现在我们可以测试一下 这个装饰者模式设计的代码有没有作用:

public class DeractorTest {
    public static void main(String[] args) {
         ShouZhuaBingInterface shouZhuaBing = new ShouZhuaBing();
         System.out.println(shouZhuaBing.getDesc() + shouZhuaBing.getPrice());
       
         EggDeractor eggDeractor = new EggDeractor(shouZhuaBing);
         System.out.println(eggDeractor.getDesc() + eggDeractor.getPrice());
       
         SausageDeractor sausageDeractor = new SausageDeractor(shouZhuaBing);
         System.out.println(sausageDeractor.getDesc() + sausageDeractor.getPrice());
      
         SausageDeractor sausageDeractor1 = new SausageDeractor(eggDeractor);
         System.out.println(sausageDeractor1.getDesc() + sausageDeractor1.getPrice());
    }
}

输出:

手抓饼5
鸡蛋手抓饼7
香肠手抓饼10
香肠鸡蛋手抓饼12