装饰器模式揭秘:我用装饰器给手机集成了ChatGPT

在平时的开发过程中,我们经常会遇到需要给一个类增加额外功能的需求,但又不想破坏类的原有结构。这时候,装饰器模式就能大显神威了!接下来,我将带你深入了解装饰器模式的原理、优缺点、适用场景以及如何在实际开发中巧妙运用。相信阅读本文后,你一定会对装饰器模式有更加深入的理解。

一,概述

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在不修改原有类结构的情况下,给一个对象动态添加额外的职责。这种模式的关键在于用组合关系代替继承关系,它基于组合关系创建一个包装对象(即装饰器)来包裹原有对象,并保持原有对象不变,将扩展集成在装饰器对象中。装饰器模式是开闭原则的最佳实践。

通常情况下,为了遵循开闭原则,我们在扩展一个类的功能时,不会直接在原有类基础上进行修改,而是用继承方式将扩展的功能集成在子类中。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果不想在增加很多子类的情况下扩展类,我们可以使用组合关系取代继承关系,它比继承能提供更灵活的扩展。

此外,装饰器对象和原对象一般实现相同的接口,这样做有两个好处。其一,客户端不需要区分装饰器对象和被装饰对象,都以统一的方式访问。其二,让装饰器对象的外层可以再套一层装饰器,实现两个装饰器功能的组合,这意味装饰器之间可以多层嵌套,实现更加复杂的功能组合。
decorator02
装饰器模式主要包含以下角色:

  1. 抽象构件(Component):接口或者抽象类,定义实体的抽象行为,下面的具体构件和装饰器都要实现这个接口。
  2. 具体构件(ConcreteComponent):实体类、被包装类,实现抽象构件,表示被装饰的对象。
  3. 抽象装饰器(Decorator):一般为抽象类,持有抽象构件的引用,并且实现了抽象构件。所有的具体装饰器都要继承该抽象装饰器。
  4. 具体装饰器(ConcreteDecorator):继承自抽象装饰器,每一个新的扩展功能都对应一个具体装饰器,具体装饰器之间可以相互嵌套使用。

优点

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

缺点

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

适用场景

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

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

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

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

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

二,实现案例

案例分析

有一家手机生产商,目前生产两种手机,一个是华为手机,一个是小米手机,它们都实现了Phone接口,该接口中定义了一个方法ican,用于展示目前手机的基本功能,包含短信,电话,4G,商城等。现在我们需要扩展两条新的功能,其一为扩展5G功能,其二集成ChatGPT功能。未来我们生产的华为或小米手机可能集成其中一种功能,也可能集成两种功能。对于这样一种场景,我们就非常适合用装饰器模式来实现。

代码实现

步骤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:创建抽象装饰器,需要实现Phone接口,并且内部包装Phone类型对象。

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();System.out.println("华为5G手机:");PhoneDecorator huawei5G=new Phone5GDecorator(new HuaWeiPhone());huawei5G.ican();System.out.println();System.out.println("集成ChatGPT的华为5G手机:");PhoneDecorator huaWeiAi=new PhoneAiDecorator(huawei5G);huaWeiAi.ican();}
}

测试结果
image-20230531111937128

三,总结

本文详细介绍了装饰器模式的原理和应用,并通过模拟手机功能扩展的案例来帮助大家深入理解装饰器模式。这是一种非常实用的设计模式,它通过组合而非继承的方式,给原有类动态地添加新功能。组合可以让类的扩展更加灵活多变,同时避免继承带来的子类膨胀问题。希望大家在今后实际开发中更好地发现和运用装饰器模式,并能够举一反三,让你的代码更加的优雅。

感谢您的阅读,希望本文能对你有所帮助,如果你喜欢这篇文章,别忘了点赞和关注哦!

1711edbd2bd444b1b647e09c2c3aff0d

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

放烟花的python程序

一.前言 重点:需要打包后的程序可以直接评论区留言或者私聊我,无需编程直接使用。 2023春节期间做的烟花程序,支持一定的个性化设置,已打包上传在我的资源。主要学习其它大神的烟花代码,后续自己做了改进和添加&#…

烟花HTML特效

这是我18年写的一个烟花的特效,拿来骗骗小孩还是有点作用的,废话不多说直接上代码. <!doctype html> <html> <head> <meta charset"utf-8"> <title>HTML5 Canvas 3D烟花动画</title> <style> html,body{margin:0px;width…

ChatGPT+大数据,会有怎样的火花?

ChatGPT到底有什么用&#xff1f;能和大数据擦出怎样的火花&#xff1f; 大家好&#xff0c;我是独孤风&#xff0c;一位曾经的港口煤炭工人&#xff0c;目前在某国企任大数据负责人&#xff0c;公众号大数据流动主理人。 最近的的ChatGPT非常的火&#xff0c;我本来是不想追什…

跨年烟花(用HTML制作动态烟花)

跨年烟花&#xff08;用HTML制作动态烟花&#xff09; 先看效果图 html代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>漂亮的3D烟花动画特效</title><style> html,body{margin:0px;width:100%;heig…

烟花代码(本人亲测,有效)

代码如下: <!DOCTYPE html> <html><head><meta charset"utf-8" /> <meta http-equiv"Content-Type" content"text/html; charsetgbk" /> <title>过年好</title> <script type"text/javascr…

HTML烟花特效,除夕快到了,把它收藏下来,过年和最重要的她一起看烟花。

文章目录 前言一、效果图二、操作步骤第一步第二步第三步第四步第五步第六步 源码 前言 最近随着电视剧《点燃我温暖你》的火热播出&#xff0c;剧中帅气学霸李洵的炫酷爱心代码也迅速火出了圈&#xff0c;爱心素材异常火爆&#xff0c;烟花也异常火爆&#xff0c;毕竟在这绿色…

分析网上的一篇“浪漫烟花“程序<VS-C++>

结果:多个烟花弹同时上升,然后进行爆炸,并进行了花样设计,采取心型设计方案,背景音乐设置为"小幸运",除此在最初,窗口设置有文本. 接下来,就让我们来分析代码: // 烟花结构 struct FIRE {int r; // 当前爆炸半径int max_r; // 爆炸中心距离边缘最大半径int …

程序员浪漫之微信烟花

2023年的到来&#xff0c;昨晚花了一些时间去网上查找异地情侣的跨年攻略&#xff0c;烟花&#xff0c;永远都是喜庆和浪漫的代言词&#xff0c;也许跨年只想和重要的那个她一起&#xff0c;那么微信烟花何尝不是一个好的方式呢&#xff1f;刚好微信发送烟花的表情就会有真正的…

ChatGPT 紧急暂停 Bing 集成,下线搜索功能

整理 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; ChatGPT 的潜力边界在哪里&#xff1f;恐怕连开发它的 OpenAI 也不知道。 正因此&#xff0c;在这项名为“Browse with Bing”的新功能&#xff0c;在ChatGPT APP上线短短一周后&#xff0c;因为不知道…

自己动手做一个mini-智能小助理

开场 最近chatgpt已经火爆了&#xff0c;几乎是家喻户晓老少皆知啊&#xff0c;公测推出60天后就已经是UV人数过亿&#xff0c;日访问量号称也是过亿。投资chatgpt研发团队的微软也是2个月内迅速推出自己的chatgpt的bing搜索&#xff0c;股票下载量都是暴增啊。前面文章已经介绍…

放弃蚂蚁offer,选择农行软开!

往期热门文章&#xff1a;1、告警&#xff1a;线上慎用 BigDecimal &#xff0c;坑的差点被开了 2、哪有这么多从零项目给你开发 3、从微服务转为单体架构、成本降低 90%&#xff01;是的&#xff0c;你没看反&#xff01; 4、Lombok 造成的翻车事故&#xff0c;太坑了&#xf…

2023中国智能客服领域最具商业合作价值企业盘点

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 随着科技的飞速发展&#xff0c;人工智能已经逐渐渗透到我们生活的方方面面。在这个波澜壮阔的时代背景下&#xff0c;智能客服作为人工智能与现代服务业的跨界融合&#xff0c;正以一种前所未有的力量改变着我们的生活。 伴…

简单体验智能AI,跟ChatGPT聊聊物通博联工业物联网

随着两会热点聚焦&#xff0c;ChatGPT、自动驾驶、仿生机器人等前沿科技热词逐渐受到社会各行各业的关注。ChatGPT的横空出世&#xff0c;使得智能AI以一种更直观的方式被大众知晓&#xff0c;有人拿它翻译文章、有人拿它写代码、还有人用它写论文。对此&#xff0c;物通博联也…

和狂飙的 ChatGPT 聊聊软件开发的现在与未来

今天&#xff0c;极小狐和科技圈“顶流”—— ChatGPT&#xff0c;聊了聊 TA 眼中的软件定义世界、研发效能方面的问题。文章的最后&#xff0c;还请 ChatGPT 留了一个彩蛋&#x1f61c;。 这场别开生面的对谈&#xff0c;就从ChatGPT的自我介绍开始吧&#xff5e; 极狐GitLa…

和ChatGPT聊了聊BDOS Online,结果……

图片来源 | 文心一格 视频来源 | 科大讯飞虚拟人 PART. 01 你对智领云的BDOS Online产品有了解吗&#xff1f; PART. 02 你觉得它和其他类似产品有什么优势或劣势&#xff1f; PART. 03 你觉得BDOS Online和其他大数据平台有什么区别&#xff1f; PART. 04 你能给我演示一下BDO…

跟ChatGPT聊聊Scratch

Scratch适合多大的孩子学习? 学习scratch有什么用? scratch是最好的少儿编程软件吗? scratch学起来会不会很难? scratch只能用来开发小游戏吗? scratch能帮助孩子考学吗? scratch对生活和工作有帮助吗? scratch与python或java 是一个层次的东西吗? scratch能赚钱吗? s…

和ChatGPT聊UML/SysML活动图模型生成测试用例

1 背景 前文讨论了UML活动图分析及用例生成实例。能够利用UML/SysML活动图模型生成测试用例&#xff0c;对软件或系统进行验证&#xff0c;自然是极好的。那是不是有了活动图模型&#xff0c;就可以生成用例呢&#xff1f;从我们看来&#xff0c;还有些问题需要澄清。 新时代新…

跟chatGpt 聊聊发布的时候老节点的线程池会怎么样

一、引言 今天同事提了一个问题&#xff0c;每次系统发布的时候在老的节点服务里面的线程池会怎么样&#xff0c;队列里面的任务会被执行完毕吗&#xff1f; 博主一直认为优雅退出一定是会等执行完才退出的&#xff0c;结果跟chatGpt聊了聊&#xff0c;一波三折。 二、分析 1…

SAP行业未来的发展如何,和chatGPT聊聊SAP行业的发展前景

序言 Chat GPT 是 OpenAI 发布的最新语言模型&#xff0c;比其前身 GPT-3 有显著提升。与许多大型语言模型类似&#xff0c;ChatGPT 能以不同样式、不同目的生成文本&#xff0c;并且在准确度、叙述细节和上下文连贯性上具有更优的表现。它代表了 OpenAI 最新一代的大型语言模…

chatgpt赋能python:Python怎么联网

Python怎么联网 介绍 Python是一种高级的编程语言&#xff0c;它能够很容易地实现联网操作。Python的标准库中包含了许多模块&#xff0c;这些模块可以用来创建网络连接、发送和接收数据以及处理网络协议等。在本篇文章中&#xff0c;我们将介绍如何使用Python进行网络操作&a…