学习装饰模式

众所周知,面向对象设计有一个很重要的原则是对修改关闭,对扩展开放。在业务需求需要扩展时,我们常常使用继承的方式,让子类替代整个父类,但是这样会导致代码量急速增加。因此可以使用封装器,也就是装饰模式,简单来说,可以在不更改一个对象的情况下,动态的为这个对象添加一些行为。

买东西流程图

假设你平时出门逛街只买一杯奶茶就回家了,但是今天你想先买鸡蛋,然后再买橘子,最后买完奶茶再回家,流程如下图,我们并没有改变"买奶茶"这个行为,只不过在它之前添加了两个行为而已。

代码设计思路

  • 首先我们要定义一个接口ComponentInteface,这个接口中有个抽象方法用来定义行为,就叫buy方法吧
  • 其次,由于我们雷打不动,每次出门都会买奶茶,因此要定义一个买奶茶的类,实现ComponentInteface接口中的买东西方法,具体实现就是输出一句话:"我要买奶茶"
  • 现在需求来了,我们除了买奶茶,还要买鸡蛋和橘子,也就是对之前的行为进行装饰,因此我们需要定义一个装饰基类并实现ComponentInteface接口,这个类中保存着指向ComponentInteface实现类对象的引用
  • 最后,我们定义买鸡蛋和买橘子的类,并继承装饰基类,由于装饰基类是接口ComponentInteface的实现类,因此,继承了装饰基类的所有子类也都是ComponentInteface的隐式实现类。

代码实现

顶级接口

java 复制代码
public interface ComponentInteface {  
    void buy();  
}

买奶茶

java 复制代码
public class BuyMilkTea implements ComponentInteface{  
    @Override  
    public void buy() {  
        System.out.println("我要买奶茶");  
    }  
}

装饰器基类

java 复制代码
public class BaseDecorator implements ComponentInteface{  
    private ComponentInteface component;  

    public void setComponent(ComponentInteface component) {  
        this.component = component;  
    }  
    @Override  
    public void buy() {  
        component.buy();  
    }
}

买鸡蛋

java 复制代码
public class BuyEggDecorator extends BaseDecorator {  
    @Override  
    public void buy() {  
        System.out.println("我要买鸡蛋");  
        super.buy();  
    }  
}

买橘子

java 复制代码
public class BuyOrangeDecorator extends BaseDecorator {  
    @Override  
    public void buy() {  
    System.out.println("我要买橘子");  
        super.buy();  
    }  
}

测试

java 复制代码
public class main {  
    public static void main(String[] args) {  
        BaseDecorator baseDecorator = new BaseDecorator();  
        BuyEggDecorator buyEggDecorator = new BuyEggDecorator();  
        BuyOrangeDecorator buyOrangeDecorator = new BuyOrangeDecorator();  
        BuyMilkTea buyMilkTea = new BuyMilkTea();  

        baseDecorator.setComponent(buyEggDecorator);  
        buyEggDecorator.setComponent(buyOrangeDecorator);  
        buyOrangeDecorator.setComponent(buyMilkTea);  

        baseDecorator.buy();  
    }  
}

输出结果

相关推荐
都叫我大帅哥3 小时前
代码世界的「万能转接头」:适配器模式的跨界艺术
java·后端·设计模式
Niuguangshuo4 小时前
Python 设计模式:迭代模式
java·python·设计模式
十五年专注C++开发6 小时前
QT 中的元对象系统(五):QMetaObject::invokeMethod的使用和实现原理
开发语言·数据结构·c++·qt·设计模式
shuaixio16 小时前
【C++代码整洁之道】第九章 设计模式和习惯用法
c++·设计模式·设计原则·常见设计模式·习惯用法
南宫生16 小时前
Java迭代器【设计模式之迭代器模式】
java·学习·设计模式·kotlin·迭代器模式
程序员小赵同学17 小时前
AI Agent设计模式二:Parallelization
开发语言·python·设计模式
千千寰宇17 小时前
[设计模式/Java] 设计模式之工厂方法模式【11】
设计模式
此木|西贝18 小时前
【设计模式】模板方法模式
java·设计模式·模板方法模式
coderzpw19 小时前
告别通勤选择困难症——策略模式
设计模式·策略模式
编程侦探20 小时前
【设计模式】原型模式:用“克隆”术让对象创建更灵活
c++·设计模式·原型模式