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

装饰器模式及应用【理论+代码】

装饰器模式(Decorator
Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种设计模式通过创建一个包装对象,即装饰器,来封装实际对象。

装饰器模式的主要组成:
组件接口:定义了对象的接口,可以给这些对象动态地添加职责。
具体组件:定义了将要接收附加责任的对象。
装饰器:持有一个组件对象的引用,并定义一个与组件接口一致的接口。
具体装饰器:负责给组件添加新的责任。

应用场景:
需要扩展一个类的功能。
动态地添加功能。
需要通过子类化来扩展功能,但又想避免使用继承带来的缺点。

  1. 定义一个coffer组件接口
public interface Coffee {
    double getCost();
    String getDescription();
}

2.实现一个便宜的黑咖啡,一块钱一杯

public class SimpleCoffee implements Coffee {
    @Override
    public double getCost() {
        return 1;
    }

    @Override
    public String getDescription() {
        return "Simple coffee";
    }
}

如何把这杯黑咖啡升值呢???当然我需要给它包装,这个时候装饰器设计模式来了,让便宜点黑咖啡山鸡变凤凰!!!
3. 装饰器抽象类来了,它可以将任何咖啡包装成你高攀不起的样子!!!

public abstract class CoffeeDecorator implements Coffee {
    protected final Coffee decoratedCoffee;

	//这和代理模式的区别,这里的类是通过构造器传过来的
    public CoffeeDecorator(Coffee coffee) {
        this.decoratedCoffee = coffee;
    }

    @Override
    public double getCost() {
        return decoratedCoffee.getCost();
    }

    @Override
    public String getDescription() {
        return decoratedCoffee.getDescription();
    }
}
  1. 不信?那我来实现个卡布奇诺
public class Cappuccino Decorator extends CoffeeDecorator {
    public Cappuccino (Coffee coffee) {
        super(coffee);
    }

    @Override
    public double getCost() {
        return super.getCost() + 31;
    }

    @Override
    public String getDescription() {
        return super.getDescription() + ", with milk";
    }
}

  1. 出来吧!包装版卡布奇诺
public class CoffeeShop {
    public static void main(String[] args) {
        Coffee coffee = new SimpleCoffee();
        System.out.println(coffee.getCost()); // 1
        System.out.println(coffee.getDescription()); // Simple coffee

        Coffee cappuccino = new Cappuccino (coffee);
        System.out.println(cappuccino .getCost()); // 32
        System.out.println(cappuccino .getDescription()); // Simple coffee, with milk
     }
}

那么,这样做有啥好处呢?我用类继承也可以实现啊

装饰器模式提供了一种灵活的替代继承的方法来扩展对象的行为。通过添加新的装饰器类,可以轻松地为现有对象添加新功能,而不需要修改原有代码。

灵活性:可以在运行时动态地添加或移除装饰器,从而改变对象的行为。这使得程序更加灵活,能够适应不断变化的需求。

低耦合性:装饰器模式通过组合而非继承来扩展功能,减少了类之间的依赖关系。这有助于降低系统的耦合度,使得代码更容易维护和扩展。

责任分离:装饰器模式将系统的不同功能分离开来,每个装饰器类负责特定的功能扩展。这种责任分离有助于降低系统的复杂性,使得各个部分更容易理解和管理。

支持开闭原则:装饰器模式支持开闭原则,即对扩展开放,对修改关闭。可以通过添加新的装饰器来扩展系统功能,而不需要修改现有代码。

相关文章:

  • 若依 Vue3的前后端分离系统管理 创建
  • 设计模式 16 迭代器模式
  • opencv/c++的一些简单的操作(入门)
  • 大数据处理从零开始————1.Hadoop介绍
  • splunk Enterprise 的HTTP收集器-windows
  • 【PLL】为什么 环路带宽是参考频率的1/10
  • MFC工控项目实例之十添加系统测试对话框
  • 《黑神话·悟空》是用什么编程语言开发的?
  • SQL-函数
  • HTML实现俄罗斯方块
  • 2024/8/30 英语每日一段
  • HTML <template> 标签的基本技巧
  • 一维/二维高斯分布的负对数似然推导
  • 黑客声称窃取海量腾讯数据?数据库加密看这...
  • 零基础Opencv学习(三)
  • 制造业中的MES知识与ERP\PLM\WMS架构关系(附智能制造MES解决方案PPT下载)
  • Oracle 和 PostgreSQL 主从对比介绍
  • 【服务对接】✈️SpringBoot 项目整合华为云 obs 对象存储服务
  • Codeforces Round 969 (Div. 2)
  • npm install速度慢,install超时报错----npm换源;npm i npm install区别
  • 屠呦呦当选美国科学院外籍院士
  • 人民日报:在大有可为的时代大有作为
  • 成都警方:在地铁公共区域用改装设备偷拍女乘客,男子被行拘
  • 五一假期如何躺赚利息?来看国债逆回购操作攻略
  • 打造全域消费场景,上海大世界百个演艺娱乐新物种待孵化
  • 广东雷州农商行董事长、原行长同日被查