学习装饰模式

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

买东西流程图

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

代码设计思路

  • 首先我们要定义一个接口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();  
    }  
}

输出结果

相关推荐
烬羽4 小时前
NestJS 依赖注入:Controller 里那个没有 new 的 service,到底从哪来的?
设计模式·typescript·nestjs
用户9385156350715 小时前
工厂模式与 Nest.js 核心思想 —— 从蜜雪冰城到企业级架构
后端·设计模式·nestjs
烬羽19 小时前
从 nest new 到 Hello World:一个最小 NestJS 项目,讲透工厂 + 装饰器 + 模块化
设计模式·node.js·nestjs
艺艺生辉2 天前
从if-else到策略模式
后端·设计模式
小林ixn2 天前
单例模式:从弹窗管理到全局状态,一个模式搞定
前端·javascript·设计模式
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-17-装饰器模式(源码剖析篇)
java·spring·设计模式·装饰器模式·源码分析·io流
workflower2 天前
案例 :某交通厅基于AI技术的智能安全运营实践
网络·人工智能·安全·设计模式·机器人
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-16-装饰器模式(业务实战篇)
java·设计模式·装饰器模式·功能扩展·动态增强
workflower3 天前
例二:某汽车制造企业深度融合AI智能体,构建园区网络的智能运维体系
人工智能·机器学习·设计模式·机器人·云计算·汽车·制造
ly76893 天前
Java 设计模式详解:从原则到 23 种经典模式
java·开发语言·设计模式