当前位置: 首页 > 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
     }
}

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

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

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

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

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

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


文章转载自:
http://approach.wjrtg.cn
http://anagrammatize.wjrtg.cn
http://adhocery.wjrtg.cn
http://carbohydrase.wjrtg.cn
http://bil.wjrtg.cn
http://aching.wjrtg.cn
http://azion.wjrtg.cn
http://astrodome.wjrtg.cn
http://bedworthy.wjrtg.cn
http://blase.wjrtg.cn
http://analyser.wjrtg.cn
http://adams.wjrtg.cn
http://anglicism.wjrtg.cn
http://autofilter.wjrtg.cn
http://athanasia.wjrtg.cn
http://aileron.wjrtg.cn
http://bbs.wjrtg.cn
http://ccd.wjrtg.cn
http://alogia.wjrtg.cn
http://boatmanship.wjrtg.cn
http://artificial.wjrtg.cn
http://calamine.wjrtg.cn
http://antimony.wjrtg.cn
http://bearded.wjrtg.cn
http://bretzel.wjrtg.cn
http://aloof.wjrtg.cn
http://bronchiectasis.wjrtg.cn
http://benniseed.wjrtg.cn
http://arborvitae.wjrtg.cn
http://bam.wjrtg.cn
http://www.dtcms.com/a/12114.html

相关文章:

  • 若依 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区别
  • 使用Python写贪吃蛇游戏
  • Golang | Leetcode Golang题解之第385题迷你语法分析器
  • 图形化编程系统学习10
  • 如何在知行之桥上通过业务单号查找原始报文?
  • erlang学习:用OTP构建系统3,应用程序服务器
  • SQL视图:简化复杂查询的利器
  • python——python-docx
  • ffmpeg视频转切片m3u8并加密videojs播放hls.js播放dplayer播放(弹幕效果)
  • Mysql集群
  • 大模型时代下,软件检测行业将如何发展?