装饰器模式:实现类功能的动态扩展

一,简介

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在不修改原有类结构的情况下,给一个对象动态添加额外的职责。通常情况下,扩展一个类的功能我们首先会想到用继承方式来实现,但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。而装饰器模式是使用组合取代继承,通过组合可以让类的扩展更加灵活多变。

装饰器模式主要包含以下角色:

  1. 抽象构件(Component):定义一个抽象接口以规范准备接收附加责任的对象。
  2. 具体构件(ConcreteComponent):实现抽象构件,为抽象构建添加基本的职责。
  3. 抽象装饰器(Decorator):含有抽象构件的引用,并且实现了抽象构建。
  4. 具体装饰器(ConcreteDecorator):实现抽象装饰器,并且每一个新的功能扩展都对应一个具体装饰器,具体装饰器之间可以相互嵌套组合。

优点

  • 动态扩展对象功能:装饰器模式遵循开闭原则,允许在不修改原有类的情况下,给对象动态添加新的功能。
  • 保证接口一致性:装饰器对象使用与被装饰对象相同的接口,保证接口一致性,让客户端调用更加简洁。
  • 细粒度的功能控制:装饰器模式允许以细粒度的方式控制对象的功能。可以根据需要选择添加不同的装饰器,组合出满足特定需求的功能组合,而不需要为每个功能组合创建独立的子类。
  • 支持装饰器的嵌套组合:装饰器模式支持嵌套使用多个装饰器,并按照一定顺序进行组合,以实现更复杂的功能扩展。通过嵌套组合,可以灵活地构建出满足特定需求的功能组合。

缺点

  • 增加了复杂性:引入装饰器模式会增加额外的类和对象,增加了系统的复杂性。如果过度使用装饰器模式,可能会导致装饰器的层级过深,代码难以理解和维护。
  • 可能影响性能:每个装饰器都需要包装被装饰对象,并在其上添加额外的功能。这可能会导致对象处理的性能有所降低,尤其是当装饰器的层级较多时。

适用场景

  • 需要在不修改现有对象代码的情况下,动态地扩展其功能。

  • 需要为一个对象提供不同的功能扩展,且这些功能扩展可以实现任意组合。

  • 需要在运行时动态地添加、删除或修改对象的功能。

  • 需要保持接口的一致性,使得客户端代码能够透明地处理被装饰对象和装饰器对象。

  • 当无法或不方便使用继承来扩展对象功能时,装饰器模式提供了一种更灵活的替代方案。

二,实现案例

案例分析

假如我们有两种手机,一个是华为手机,一个是小米手机,我们需要为二者扩展5G功能,同时又要为其集成AI功能。对于这样一种场景,我们可以用装饰器模式来实现。

代码实现

步骤1:创建抽象构件和具体构件

public interface Phone {void ican();
}
public class HuaWeiPhone implements Phone{@Overridepublic void ican() {System.out.println("huawei capacities:call,sms,4G,huaweiStore");}
}
public class XiaoMiPhone implements Phone{@Overridepublic void ican() {System.out.println("xiaomi capacities:call,sms,4G,xiaomiStore");}
}

步骤2:创建抽象装饰器

public abstract class PhoneDecorator implements Phone{protected Phone phone;public PhoneDecorator(Phone phone) {this.phone = phone;}public void ican(){phone.ican();}}

步骤3:创建具体装饰器----5G装饰器

public class Phone5GDecorator extends PhoneDecorator {public Phone5GDecorator(Phone phone) {super(phone);}private void add5G() {System.out.println("extended capacity: 5G");}@Overridepublic void ican() {phone.ican();add5G();}
}

步骤4:创建具体装饰器----Ai装饰器

public class PhoneAiDecorator extends PhoneDecorator{public PhoneAiDecorator(Phone phone) {super(phone);}private void addAi() {System.out.println("extended capacity: chatGPT");}@Overridepublic void ican() {phone.ican();addAi();}
}

步骤5:客户端测试

public class Client {public static void main(String[] args) {System.out.println("华为普通手机:");Phone huawei=new HuaWeiPhone();huawei.ican();System.out.println("华为5G手机:");PhoneDecorator huawei5G=new Phone5GDecorator(new HuaWeiPhone());huawei5G.ican();System.out.println("集成Ai的华为5G手机:");PhoneDecorator huaWeiAi=new PhoneAiDecorator(huawei5G);huaWeiAi.ican();}
}

测试结果

image-20230530223926308

三,总结

本文详细介绍了装饰器模式的原理、优缺点、适用场景,并通过一个生动的例子来帮助大家理解装饰器模式。这是一种非常实用的设计模式,它通过组合而非继承的方式,给原有类动态地添加新功能,避免了类层次过于复杂的问题。希望本文能够帮助大家在实际开发中更好地运用装饰器模式,提高代码的可扩展性和可维护性。

好了,希望这篇文章对你的学习有所帮助,在此感谢你的阅读,我们下次再见!

1711edbd2bd444b1b647e09c2c3aff0d

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/250878.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

One2Multi Graph Autoencoder for Multi-view Graph Clustering

One2Multi Graph Autoencoder for Multi-view Graph Clustering | Proceedings of The Web Conference 2020 (acm.org) 目录 Abstract 1 Introduction 2 Model 2.1 Overview 2.2 One2Multi Graph Convolutional Autoencoder Informative graph convolutional encoder M…

linux常见的二十多个指令

目录 一、指令的概念 二、28个常见的指令 ⭐2.1 ls指令 ⭐2.2 pwd指令 ⭐2.3 cd指令 ⭐2.4tree指令 ⭐2.5 mkdir指令 ⭐2.6 touch指令 ⭐2.7 rmdir指令 ⭐2.8 rm指令 ⭐2.9 clear指令 ⭐2.10 man指令 ⭐2.11 cp指令 ⭐2.12 mv指令 ⭐2.13 cat指令(适…

Python画五角星(turtle初识)

Python可以做很多事情,主要归功于python下的各种模块。画图也不例外,通过简单地turtle模块,可以画出各种图案。 首先,使用python画图,需要安装turtle模块。在控制台输入pip install turtle执行 import turtle turtle.…

用python的turtle画五角星

最近开始学python,做作业的时候遇到画五角星并填充颜色。网上搜到的方法是画五条直线,但是作业要求的图形是这样 #用循环结构画五角星 import turtle from turtle import *turtle.delay(2) #定义一个画五角星的函数 def stardraw(start_position,side)…

Python turtle教程一:画箭头、矩形,五角星(亲测,可用)

Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图…

初学Python画五角星

这学期开的Python课,之前学过java,c还有HTML5/css,不过感觉自己并不是学这些的料,这个是老师布置的作业,让我们自己画个图,就画了个简单的,心血来潮想写个博客,就直接上图了吧&#…

python画多层次五角星

此次用到海龟绘图函数——turtle,下面是程序中可能会用到的方法 forward() #前进 right() #右转 exitonclick() #绘制完退出Next ,show time! 1.创建一个python项目文件 2.分析单个五角星画法 我们默认每次画笔右转144度画五角星的一个角,那么画笔右转…

python画五角星

python画五角星 今天刚学python海龟画图,课堂作业画五角星,顺便分享给大家。 运行图片如下: 代码如下: # 以画布中心为中点,向右为X轴正方向,向上为Y轴正方向 import turtle turtle.setup(500, 500) #…

HTML5-画一个简单五角星

HTML5-画一个简单五角星 <!DOCTYPE HTML><html><body><canvas id"myCanvas" width"200" height"200" style"border:1px solid #c3c3c3;" mce_style"border:1px solid #c3c3c3;">Your browser does …

玩转Python之Turtle画五角星

Turtle库是Python语言中一个很流行的绘制图像的函数库&#xff0c;下面就给大家分享用Turtle画五角星&#xff1a; #codingutf-8 import turtle import time turtle.pensize(5) turtle.pencolor(“yellow”) turtle.fillcolor(“red”) turtle.begin_fill() for _ in range(5…

使用 opencv 画 五角星

// 绘制多边形 void CV120201012Dlg::mutiplyDraw() { // 定义一张背景板 Mat img Mat(Size(800, 800), CV_8UC3); img Scalar(0, 0, 0); // 定义5个顶点坐标 Point p1(439, 126); Point p2(466, 198); Point p3(546, 198); Point p4(482, 244);…

用OpenGL画五角星

第一次写博客&#xff0c;正在上大二&#xff0c;学的计算机专业&#xff0c;因为课很杂&#xff0c;想把自己学过的东西顺便写下来做个记录&#xff0c;写的不好请见谅&#xff01; 这个学期学的图形学&#xff0c;主要是讲OpenGL的东西&#xff0c;老师让我们自己用GL_LINES、…

画七彩五角星

using (Graphics graphics this.CreateGraphics()){graphics.Clear(Color.White); Point[] points {//顺时针点坐标new Point(80, 0), new Point(100, 60), new Point(160, 60), new Point(110, 100),new Point(130, 160), new Point(80, 120), new Point(30, 160), new Poi…

【C语言】结构体——我就是秩序的创建者!(结构体数组、结构体指针、嵌套、匿名、字面量、伸缩型数组、链式结构)

一、结构体基础1.1 声明和定义1.1 初始化和赋值1.3 访问结构体成员 二、结构体数组2.1 定义和初始化2.2 访问 三、结构体的嵌套五、指向结构体的指针六、向函数传递结构体6.1 只传递结构体成员6.2 传递结构体指针6.3 传递结构体 七、结构体的其他特性——不容小觑7.1 结构体的大…

阿里云的云安全审计可以用于哪些安全事件与合规审核?

阿里云的云安全审计可以用于哪些安全事件与合规审核&#xff1f; [本文由阿里云代理商[聚搜云www.4526.cn]撰写] 随着互联网的高速发展&#xff0c;各种互联网应用和服务也在不断涌现。但在运营过程中&#xff0c;安全事件和合规审核问题也不断出现。如何及时、准确地识别并解决…

通俗易懂讲PIC单片机:从一窍不通到入门进步

单片机入门不难------谈PIC系列&#xff08;转自矿石收音机论坛---崂山&#xff09;十年前的老帖子&#xff0c;讲得通俗易懂&#xff0c;分享之。 请看图1 这个8条腿的小螃蟹就是我们的第一顿饭&#xff0c;只要把它吃下去&#xff0c;以后的大餐就好办了。第1、8条腿接电源 …

PIC单片机-Mplab的使用与PIC单片机介绍

内容包括Mplab IDE与Mplab X IDE的使用&#xff0c;触摸功能实践&#xff0c;PIC单片机C与汇编混合编程&#xff0c;PIC单片机介绍等。紫色文字是超链接&#xff0c;点击自动跳转至相关博文。持续更新&#xff0c;原创不易&#xff01; 目录&#xff1a; 一、Mplab IDE的使用…

单片机之汇编语言和C语言(以PIC单片机为例)

目录 计算机语言计算机语言类别中断定时/计数器 C语言数据类型C语言动态数组C语言中void什么意思C语言宏定义单片机C语言的扩充数据类型单片机C语言的运算符单片机C语言的基本语句单片机汇编语言基本语句&#xff08;PIC&#xff09;PIC单片机基础概念PIC16F887&#xff08;40引…

【转】PIC单片机C语言简记

1.PICC安装&#xff1a; PICC编译器可以直接挂接在MPLAB-IDE集成开发平台下&#xff0c;实现一体化的编译连接和原代码调试。使用MPLAB-IDE内的调试工具ICE2000 、ICD2 和软件模拟器都可以实现原代码级的程序调试&#xff0c;非常方便。 首先必须在你的计算机中安装 PICC 编…

PIC单片机入门_C语言编程技术

1.为什么也是C语言&#xff1f; 用C 语言来开发单片机系统软件最大的好处是编写代码效率高、软件调试直观、维护升级方便、代码的重复利用率高等&#xff0c;因此C 语言编程在单片机系统设计中越来越广泛的运用。PIC 单片机的软件开发&#xff0c;同样可以用C 语言实现。 Micro…