一文带你看懂装饰者模式

装饰者模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀;

主要角色:

类图:

一文带你看懂装饰者模式

看具体的例子,就拿去火锅店吃火锅拌蘸料这个来说。

蘸料有很多:

而每个人的口味又不一样。所以组合就非常多。这种情况下如果使用装饰着模式来实现看看。

第一步

首先我们有一个行为拌蘸料(Component)

/**
 * @Author: jimmy
 * @Description:
 *   装饰着模式 -
 *   组件(Component):组件接口定义了全部组件类和装饰器实现的行为;
 */
public interface AllocatSeasoning {
    void allo();
}

接下来,按照上面装饰者的模型进行分析,我们需要2个类来实现上面的行为

第二步

第一个类(ConcreteComponent)可以理解为装拌料的碗,后面的加蘸料都放到这个碗里面

/**
 * @Author: jimmy
 * @Description:
 *  组件实现类(ConcreteComponent):
 *    实现Component接口,组件实现类就是被装饰器装饰的原始对象,
 *    新功能或者附加功能都是通过装饰器添加到该类的对象上的;
 *
 *  可以把这个理解为装拌料的碗
 */
public class AllocDo implements AllocatSeasoning{

    @Override
    public void allo() {
        System.out.println("----- 您好,这边是调料自选区,可以按照您的口味选择自己喜欢的口味 -----");
    }
}

第三步

第二个类,这个类可以理解为抽象

/**
 * @Author: jimmy
 * @Description:
 *  装饰器抽象类(Decorator):
 *        实现Component接口的抽象类,在其中封装了一个Component 对象,
 *     也就是被装饰的对象;
 *
 *    这个对象可以理解为已经准备好了,要去拿蘸料的动作的父级。
 *    AllocatSeasoning可以理解为 蘸料和婉的合体。
 */
public class AllocDecorator implements AllocatSeasoning{

    // 持有对象
    private AllocatSeasoning allocatSeasoning;

    // 构造器
    public AllocDecorator(AllocatSeasoning allocatSeasoning) {
        this.allocatSeasoning = allocatSeasoning;
    }

    // 调用对下个对应的方法
    @Override
    public void allo() {
        allocatSeasoning.allo();
    }
}

第四步

放具体的蘸料(ConcreteDecorator)这里说白了就是 拿着放有蘸料的碗(可以是空碗)来放现在想放的蘸料。我这里只给出了一个具体类,其他的有兴趣可以把代码复制,然后补充下。

/**
 * @Author: jimmy
 * @Description:
 *    具体装饰器类(ConcreteDecorator):该实现类要向被装饰的对象添加某些功能;
 *  这里说白了就是 拿着放有蘸料的碗(可以是空碗)来放现在想放的蘸料
 */
public class GarlicAlloc extends AllocDecorator{

    public GarlicAlloc(AllocatSeasoning allocatSeasoning) {
        super(allocatSeasoning);
    }

    @Override
    public void allo() {
        // 调用原有业务方法
        super.allo();
        // 补充我们这个行为的方法
        addGarlic();
    }

    public void addGarlic() {
        System.out.println("---加蒜---");
    }
}

测试类

public class DecoratorClinet {
    public static void main(String[] args) {
        AllocatSeasoning a = new OilAlloc(new GarlicAlloc(new ChilliAlloc(new AllocDo())));
        a.allo();
    }
}

运行结果:

----- 您好,这边是调料自选区,可以按照您的口味选择自己喜欢的口味 -----

---加辣椒---

---加蒜---

---加油---



一文带你看懂装饰者模式

展开阅读全文

页面更新:2024-05-07

标签:和婉   模式   选区   调料   说白了   新功能   组件   口味   您好   原始   接口   也就是   对象   功能   方法   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top