• java装饰器模式


    一、原文地址:

    秒懂设计模式之装饰者模式(Decorator Pattern)_ShuSheng007的博客-CSDN博客

    二、定义

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

    三、使用场景

    1. 需要在运行时动态的给一个对象增加额外的职责时候
    2. 需要给一个现有的类增加职责,但是又不想通过继承的方式来实现的时候(应该优先使用组合而非继承),或者通过继承的方式不现实的时候(可能由于排列组合产生类爆炸的问题)。

    四、 UML图

    假设我们有一个原味咖啡的类 OriginalCoffee, 目前的需求就是要动态的给这个类的一些实例增加一些额外功能,此处就是动态的对某些咖啡制作过程增加新的流程,例如加奶,加糖,而有的咖啡却保持原味不变。

     首先我们有一个ICoffee接口,里面有一个制作咖啡的接口方法makeCoffee()。要进行装饰的类 OriginalCoffee装饰者基类CoffeeDecorator(一般为抽象类)实现了此接口。

    CoffeeDecorator类里面持有一个ICoffee引用,我们第一步会把要装饰那个原始对象赋值给这个引用,那样在装饰者类中才可以调用到那个被装饰的对象的方法。

    MilkDecoratorSugarDecorator 都继承至CoffeeDecorator, 都是具体的装饰者类。

    五、咖啡加奶加糖的例子具体实现

    第一步:先声明一个原始对象的接口

    1. public interface ICoffee {
    2. void makeCoffee();
    3. }

    第二步:构建我们的原始对象,此处为原味咖啡对象,它实现了ICoffee接口。

    1. public class OriginalCoffee implements ICoffee{
    2. @Override
    3. public void makeCoffee() {
    4. System.out.println("原味咖啡");
    5. }
    6. }

    第三步:构建装饰者抽象基类,它要实现与原始对象相同的接口ICoffee,其内部持有一个ICoffee类型的引用,用来接收被装饰的对象。

    1. public abstract class CoffeeDecorator implements ICoffee{
    2. private ICoffee coffee;
    3. public CoffeeDecorator(ICoffee coffee){
    4. this.coffee = coffee;
    5. }
    6. @Override
    7. public void makeCoffee() {
    8. coffee.makeCoffee();
    9. }
    10. }

    第四步:构建各种装饰者类,他们都继承至装饰者基类 CoffeeDecorator。此处生成了两个,一个是加奶的装饰者,另一个是加糖的装饰者。

    MilkDecorator

    1. package milk;
    2. public class MilkDecorator extends CoffeeDecorator{
    3. public MilkDecorator(ICoffee coffee) {
    4. super(coffee);
    5. }
    6. @Override
    7. public void makeCoffee() {
    8. super.makeCoffee();
    9. addMilk();
    10. }
    11. private void addMilk(){
    12. System.out.println("加奶");
    13. }
    14. }

    SugarDecorator

    1. public class SugarDecorator extends CoffeeDecorator{
    2. public SugarDecorator(ICoffee coffee) {
    3. super(coffee);
    4. }
    5. @Override
    6. public void makeCoffee() {
    7. super.makeCoffee();
    8. addSugar();
    9. }
    10. private void addSugar(){
    11. System.out.println("加糖");
    12. }
    13. }

    第五步:客户端使用

    1. public static void main(String[] args) {
    2. // 原味咖啡
    3. ICoffee coffee = new OriginalCoffee();
    4. coffee.makeCoffee();
    5. // 加奶的咖啡
    6. coffee = new MilkDecorator(coffee);
    7. coffee.makeCoffee();
    8. // 先加奶,后加糖的咖啡
    9. coffee = new SugarDecorator(coffee);
    10. coffee.makeCoffee();
    11. }

    可以从客户端调用代码看出,装饰者模式的精髓在于动态的给对象增减功能

    六、字符串处理的场景

    6.1 背景

  • 相关阅读:
    判断DataFrame中是否存在具有相同内容的行将具有相同内容的行进行标记和处理
    React通过ref获取子组件的数据和方法
    @umijs/plugin-locale使用
    leetcode做题笔记169. 多数元素
    图解LeetCode——1796. 字符串中第二大的数字(难度:简单)
    网关、网桥、路由器和交换机之【李逵与李鬼】
    Java 函数式编程
    每日一题 —— LC. 891 子序列的宽度之和
    项目初始化时ApplicationRunner和CommandLineRunner的应用
    3、【Xilinx下载器】【ILA】使用ILA调试时出错的解决方案
  • 原文地址:https://blog.csdn.net/qq_39208536/article/details/125614137