当前位置: 首页 > article >正文

设计模式——装饰者模式

1 现状

现有已经在线上运行的“吃鸭”业务代码,先声明Eat接口,再用EatDuck类实现Eat接口,最后通过Client初始化EatDuck实例,再调用该实例的eatFood方法实现吃鸭。

 

1.1 定义吃的接口

package com.design.patterns.adapter;

public interface Eat {
    
    /**
     * 吃东西是共性方法
     */
    void eatFood();
}

1.2 吃鸭是专门的实现

package com.design.patterns.adapter;

public class EatDuck implements Eat {

    @Override
    public void eatFood() {
        // 吃鸭是独有的实现
        System.out.println("我在吃鸭");
    }

}

1.3 调用吃鸭业务代码

package com.design.patterns.adapter;

public class Client {
    public static void main(String[] args) {
       new EatDuck().eatFood();
    }
}

2 问题

“吃鸭”的业务在线上运行良好,但是某天leader找到你说,在吃鸭前你需要洗手、蘸酱等流程。

最简单的方式,莫过于在原来的EatDuck类的eatFood方法中耦合洗手、蘸酱的代码,以快速满足需求。如下:

package com.design.patterns.adapter;

public class EatDuck implements Eat {

    @Override
    public void eatFood() {
       
        System.out.println("我在洗手");
        System.out.println("我在蘸酱");

        // 吃鸭是独有的实现
        System.out.println("我在吃鸭");
    }

}

但是EatDuck类的eatFood还被多处业务引用,有的引用处只需要“吃鸭”操作就好,而不想你改动原有的实现,且leader也不想你的代码耦合度太高

怎么办?怎样才能在不修改EatDuck类的基础上,实现洗手、蘸酱的功能呢?

思考有没有可能将吃鸭、洗手、蘸酱通过一个适配器连接在一起。

3 尝试做法

 3.1 旧有代码不变

3.2 定义抽象动作类

package com.design.patterns.adapter;

public abstract class Action implements Eat{

    protected Eat eat;

    public Action(Eat eat){
        this.eat=eat;
    }
}

 3.3 洗手实现动作类

package com.design.patterns.adapter;

public class WashAction extends Action{

    public WashAction(Eat eat){
        super(eat);
    }

    @Override
    public void eatFood() {
        System.out.println("我在洗手");
      eat.eatFood();
    }

}

3.4 蘸酱动作实现类

package com.design.patterns.adapter;

public class DipAction extends Action{

    public DipAction(Eat eat){
        super(eat);
    }

    @Override
    public void eatFood() {
        System.out.println("我在蘸酱");
        eat.eatFood();
    }
}

3.5 客户端调用

package com.design.patterns.adapter;

public class Client {
    public static void main(String[] args) {

        new WashAction(new DipAction(new EatDuck())).eatFood();
    }
}

3.6 运行结果

 


http://www.kler.cn/a/5094.html

相关文章:

  • vs2022编译webrtc步骤
  • Nacos server 2.4.0 版本已知问题和 Bug 汇总
  • 计算机网络之---传输层的功能
  • 算法(二)——一维差分、等差数列差分
  • DEV C++软件下载
  • 设计模式-结构型-组合模式
  • satellite.js库下载、介绍、安装、引用,返回函数的方法
  • chatgpt-retrieval-plugin:chatgpt检索插件简介
  • 读《刻意练习》后感,与原文好句摘抄
  • linux串口通信
  • 硬件语言Verilog HDL牛客刷题day04 序列检测部分
  • 线程安全、线程同步(同步代码块、同步方法、同步锁)
  • 【Linux】gcc/g++区别和联系
  • docker私有仓库,仓库管理器
  • 程序监控报警失败自动重启脚本
  • 【不同入参ajax请求】ajax请求接口入参form形式和body形式如何写前端代码(附源码详解)
  • Appium 自动化测试从入门到精通,零基础也能听懂
  • 掌握C语言的这3个函数,你就学会随机读写文件了
  • 二战华为成功上岸,准备了小半年,要个27k应该也算不上很高吧~
  • redis 三. hash应用场景及底层分析
  • PCIe基础
  • 第15章_存储过程与函数
  • Python图片相册批处理器的设计与实现批量添加图片水印、批量命名等功能
  • order by是怎么工作的?
  • Java数据结构之基于ArrayList编写大众麻将和扑克牌洗牌小练习
  • RXSwift在项目中实战总结: Subject, Driver, 高阶函数