软件构造第四章——委派,六种复用设计模式

ESP8266+ITR8307实战:如何用反射式光电管实现5cm远距离检测(附避坑指南) 本文详细介绍了如何利用ESP8266的ADC功能与ITR8307反射式光电管,通过调制解调、硬件电路优化及软件同步采样策略,实现5cm稳定远距离检测。文章提供了完整的硬件设计、代码实现与调优避坑指南,有效解决了环境光干扰与信号衰减难题,适用于智能车、自动化等需要可靠非接触检测的项目。 阅读详情

一.委派的定义

委派的定义很简单,一个对象请求另一个对象的功能罢了。
就是自己不干活,而交给别人干,自己负责调度,负责管。委派本身在我看来并不强大,强大的是委派与继承的共用。

二.委派的分类

委派中A对象调用B对象,根据B对象的来源不同,可以分为不同的种类。

依赖:B对象是动态传入A,并且A不保存B对象。B对象只是与A的方法依赖。这是临时性的委派。
关联: B作为A的成员被保存。
关联分为两类:组合和聚合。
在我的理解中B是A的组成,A与B不可分离,B消失只有A消失,A与B是组合关系,就像CPU组成电脑,电脑是不能随便更换CPU的,没了CPU电脑就不是电脑。
聚合关系:A会保存B,但A与B是可分离的。就像鼠标和电脑,电脑可以随时换鼠标。

三.继承与委派的关系

从语义上说,继承是A is B,委派是A has B.
从对被调用类的的关系说,继承是A类需要B类中所有方法,委派是A类需要使用B类部分方法。
从类与对象关系说,继承是类与类的关系,委派是对象之间的关系。
我觉得,继承对于类的限定太严格。而委派就灵活的多。继承是静态的,没有灵活性。而委派是动态的。

四.CRP原则

组合复用原则:要求应该使用组合实现复用,而不是继承。
从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性。于是就提出了组合/聚合复用原则,也就是在实际开发设计中,尽量使用合成/聚合,不要使用类继承。即在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新对象通过向这些对象的委派达到复用已有功能的目的。就是说要尽量的使用合成和聚合,而不是继承关系达到复用的目的。

五.面向复用的结构性设计模式

最近也在看JAVA设计模式与实践,里面是这么定义设计模式的:设计模式是前辈的经验积累,是对一般问题通用的解决方案,增强系统的可维护性与可复用性。
设计模式是面向于一般问题的通用解决,我们开发时总会有相似的场景出现,而设计模式就是解决这种场景的。设计模式的学习,必须要去体会场景,去思考抽象一般问题,学会把场景套用在一般问题上。

适配器模式

一般问题:现在存在的类提供的方法,不符合客户端调用接口。
解决方案:用适配器类适配接口。
这个问题解决遗留代码之间的复用。解决老问题。

适配器类实现接口,而接口方法中进行委派,委派给遗留类。

装饰器模式

这个模式用来动态地为对象添加新功能。
一般问题:1.实现很多不同特性的任意组合。
2.扩展已有的功能

装饰器使用

通用模块接口,具体实现类,与装饰类都实现通用接口。
而装饰器再委托对于每个方法再委托给内部的一个模块接口。
额,没有UML图好难说,举个栗子。
现在有一家咖啡店,买黑咖啡,可以加糖,加奶油,加冰。加一种算不同钱,如果只能加一种,我么可以写成不同的类。可是如果是任意组合呢?
装饰器模式就是创建一个咖啡接口,里面有一的算钱的功能,黑咖啡是实现,而奶油,糖,和冰我们也表示为咖啡接口,但内部还有有一个咖啡类。我们的算钱方法,就是调用内部的算钱方法,再添加该种配料的钱。
这样,我咖啡加糖,加完加奶油,可以随便扩展。

书上说分为透明装饰器和不透明装饰器两部分
其中透明装饰器是最能发挥装饰器优点的,也是最适合装饰器模式的。
在我看来,不透明装饰其实根本不如直接委派,不透明装饰很多缺点,所以我在实验中没有使用不透明装饰。

透明装饰器

完全的面向抽象编程,符合LSP原则。装饰器对被装饰只有方法扩展没有重写。这是最好的装饰类,因为多层装饰以后,我们还可以直接调用最外层装饰的方法。客户端无需知道我们的装饰过程。
这个最适合扩展方法功能,也是最理想的装饰。一般在JAVA源码中被用来添加缓冲层都是这个模式。

不透明装饰器

不透明装饰更灵活,但是破坏了LSP原则,多层装饰也无法统一。
装饰器重写了子类方法。这种不能完成多层装饰。我们应该尽可能实现透明装饰器。而不是不透明装饰器。

装饰器的优缺点
  1. 对于扩展一个对象的功能,装饰模式比继承更加灵活性,不会导致类的个数急剧增加。

  2. 可以通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的具体装饰类,从而实现不同的行为。

  3. 可以对一个对象进行多次装饰,通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合,得到功能更为强大的对象。

  4. 具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,原有类库代码无须改变,符合“开闭原则

  5. 缺点:动态组合功能,出问题需要排查每一个功能类。排错复杂。要求每一个类测试充分。

外观模式

问题:客户端需要调用大量方法完成功能,过于繁琐
解决:我们提供统一的接口,为客户端提供一个小接口完成需要的功能。

在我看来,这就是把客户端的职责下移到后端开发身上,提供一个小接口,便于方法调用。

六.面向复用的行为模式

策略模式.

问题:同一个方法,不同的算法实现。
很多时候不同算法对于不同数据性能不同。
解决方案:将其放入一个接口,对于该创建不同实现类。然后动态传入需要的方法类。

策略模式可以说是标准的用委派实现复用,动态实现不同的方法。运行时创建,策略模式思想就是基于委派,我自己只管方法调度,具体实现让委托类实现。

模板模式

问题:不同方法有统一的调用顺序,但是具体的方法实现不同。
我用个通俗比喻:就像人一天吃饭,不同的人都要一日三餐,而每个人吃的不同。
解决方法:设置一个抽象类,里面有一个方法有具体的调用过程,抽象的步骤。而子类重写具体步骤。
模板模式是要依赖于一个具体的方法调用过程。所以模板模式是不允许接口的(额,default方法好像也可以,我一开始实验亲自写了个模板。),是抽象类。
并且模板是完全依赖继承而与委派没有关系的。这是很不一样的一点。

迭代器模式

问题:用户希望遍历类中所有数据
解决方法:这回是现成的,实现Iterable 接口,实现里面的iterator方法返回自定义的iterator类(自己实现hasnext,next)方法。

Iterable接口是表明我有一个迭代器给你用,而具体迭代要给iterator类。
迭代器模式,虽然是具体的,但这个设计思想还是在JAVA中很普遍的,在我看来,用接口定义功能。统一不同的类。

i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0) 一. 下载BusyBox BusyBox是一个继承了大量Linux命令核工具的软件,像常用的ls、cp、mv、ifconfig等命令。一般下载BusyBox的源码,然后配置Busybox,选择自己想要的功能,最后编译即可。 BusyBox在官方可以直接下载:https://www.busybox.net/。目前最新是1.35.0,这里我使用1.29.0版本。 axel https://www.busybox.net/downloads/busybox-1.29.0.tar.bz2 下载之后解压: tar 阅读详情

相关推荐

从硬件到软件:深度解析D435i USB SCP overflow错误的根源与解决方案

本文深入解析Intel RealSense D435i相机在ROS环境下常见的'USB SCP overflow'错误,特别是与`control_transfer`相关的错误提示。从硬件配置到软件优化,详细介绍了如何通过调整USB接口、优化`rs_camera.launch`参数、更新固件驱动等方法解决数据传输溢出问题,提升设备稳定性和性能。

yy01234的博客 771

软件构造 继承和委派

关于继承和委派

Zoom_9527的博客 967

深入Linux内核:PTP硬件时间戳(HW Timestamp)是如何炼成的?

本文深入探讨了Linux内核中PTP硬件时间戳(HW Timestamp)的实现原理与实战应用。通过分析IEEE 1588协议在网络时间同步中的关键作用,详细解析了硬件时间戳在Linux内核中的架构设计、驱动开发及性能优化技巧,帮助开发者实现纳秒级精度的时间同步。

weixin_30727835的博客 651

继承、委派

委派:对象间 继承:类间 几种委派类型 1.临时 在调用相应方法时才传入,通过方法建立委派关系,用时才传入 2.永久 在Rep中显示出来,即通过构造器或set方法建立委派关系。 以上两种是从外部动态传入的。 3.还有一种永久类型,是在Rep中固定委派对象的类型,不是动态传入的,无法改变类型。 继承和委派的使用及组合: 把每种维度用接口ABC…表示,对每个维度的各种具体特殊情况,分别实现其该接口的不同类a1,a2…b1,b2…。 再用一个接口T实现各个行为接口ABC…,即对各种维度进行组合,完成需求。 最后实

weixin_44146646的博客 797

sap2000 api matlab,SAP2000_API入门指南.pdf

SAP2000_API入门指南北 京 金 土 木 软 件 技 术 有 限 公 司Beijing Civil King Software TechnologyCo., Ltd.SAP2000 API 入门指南余承飞 韦群跃 汤娣概述SAP2000 API 是从 SAP2000 V11 开始引进的,即应用软件编程接口。用户可以编写程序,通过API 随心所欲地调用 SAP2000...

weixin_42118423的博客 1942

anaconda的conda国内加速镜像源(pytorch 快速安装)

最近清华源不太好使了,所以推荐中科大镜像源,如下 1.还原原始通道 conda config --remove-key channels 2.

qq_41719643的博客 2万+

设计模式(复用性)

侯捷设计模式(复用性)总结

harry0818的博客 459

异次元发卡最新漏洞0day(XSS组合拳)

异次元商店头像上传处存在存储型XSS注入(user、admin均存在)。其中,user处有过滤,admin无。 将恶意脚本插入后,管理员访问用户管理页面即可执行恶意脚本。 恶意脚本执行后,会新增一个管理员用户,进而获得权限。鉴于漏洞还没有泛滥,而且很多站都有漏洞。EXP暂时不公开。需要学习可以加入知识星球

白昼小丑的博客 4599

设计模式--可复用面向对象软件的基础(第一章 引言)

第一章 引言一、什么是设计模式二、SmalltalkMVCSmalltalk MVCSmalltalkMVC中的设计模式三、描述设计模式四、设计模式的编目五、组织编目六、设计模式怎样解决设计问题七、怎样选择设计模式八、怎样使用设计模式 一、什么是设计模式 一般而言,一个模式有四个基本要素: 1、模式名 一个助记名,它用一两个词来描述模式的问题、解决方案和效果; 2、问题 描述了应该在何时使用模式,它解释了设计问题和问题存在的前因后果; 3、解决方案 描述了设计的组成成分、它们之间的相互关系及各自的职责和协作

我与黑夜 815

用blender为模型贴图并在gazebo中显示

用blender为模型贴图并在gazebo中显示 首先我用的是最新的blender2.92版本,附上链接https://www.blender.org/download/。并设置好简体中文。语言可以在编辑->偏好设置->界面里面设置。 首先界面右上角的摄像头,方块,灯光三个场景全都删除。 接着导入stl格式的模型文件,下面以tianbot_mini上面的激光雷达的模型为例。 导入激光雷达模型后,点击进入上方的UV Editing按钮进入UV编辑界面 此时我面看见网格化的激光雷达模型

qq_48427527的博客 8001

C#上位机实战:PLC与检测设备无缝对接,构建产品质量实时判定系统

本文分享了基于C#开发的汽车零部件质量检测系统实现经验。系统采用三层架构:设备层(PLC/视觉相机/三坐标)、通信层(OPC UA/SDK/串口)和应用层(数据采集/判定/存储)。重点解决了三大技术难点:1)通过OPC UA订阅模式将PLC通信延迟从500ms降至50ms;2)反编译厂商Demo破解视觉SDK对接难题;3)采用时间戳+产品ID实现多设备数据同步。系统上线后质检人员减少67%,误判率降至0.5%,数据追溯效率显著提升。文章强调工业场景下稳定性优先于技术复杂度,实用经验值得借鉴。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 801

软件构造复习(1) ——面向复用的设计模式

前言:本周80学时的软件构造课程部分正式结束,从今天开始正式梳理并且复习一下软件构造学的知识。 第一天:复习第四章,也是课程的最重要的部分,面向复用的设计模式,面向复用的设计模式有:Adapter(适配器模式)、Decorator(装饰器模式)、Facade(外观模式)、Strategy(策略模式)、Template method(模板模式)、Iterator(迭代器模式)。 1.Adapter 适配器设计模式 适配器模式解决的问题:解决接口间不兼容的问题,我们想要复用现有的已经存在的类,但是现有的类和我们

weixin_45406155的博客 764

2026年寒武纪数字IC笔试试卷带答案

本文摘要: 该数字IC设计测试卷包含单选题(30分)、波形分析题(15分)、多选题(30分)三类客观题,覆盖时序约束、半导体工艺、状态机、数制转换、同步复位等核心知识点。重点考察:1)跨时钟域处理(如异步FIFO、格雷码应用);2)时序分析(建立/保持时间、时钟约束指令);3)低功耗设计技术(时钟门控、DVFS);4)寒武纪MLU架构特性(张量核、混合精度计算)。解析强调工程实践要点,如异步复位需同步释放、建立时间违例与频率的关联性等。试题难度梯度明显,既包含基础概念辨析(如Moore/Mealy状态机),

Open 224

设计模式七大原则---合成复用原则

设计模式 c++ 合成服用原则

jiyanghao19的博客 1646

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java委派_一文读懂java类加载之双亲委派机制

作者:程序猿微录出自:TinyRecord一个编译后的class文件,想要在JVM中运行,就需要先加载到JVM中。java中将类的加载工具抽象为类加载器,而通过加载工具加载类文件的具体方式被称为双亲委派机制。知识点类加载器:通过一个类全限定名称来获取其二进制文件(.class)流的工具。前述首先明确一点,Java中类是描述一类对象的行为和状态,拥有封装、继承、多态特征。而类加载器这个对象在类结构上...

weixin_39647471的博客 323

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

关于代码复用中委派的意义

在学习软件构造这门课程之前,对于代码复用这个问题,我所了解的最多的就是类的继承。 类的继承是面向对象语言的三大特征(继承,封装,多态)之一。它是实现软件复用的重要手段。 而不同于C++语言的多继承,在Java语言中继承具有单继承的特点, 即每个子类只有一个直接父类。子类继承自父类, 将获得父类的全部成员变量和方法,这样就很好的复用了父类的代码。 委派也是一种提高代码复用性的手段。它让一个对象请求另一个对象的功能,获得一个操作并将其发送到另一个对象。 但是,我们为什么要使用委派?它相对于继承的优

qq_52138327的博客 356

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

复用形式之:委派(delegation)

1.    委派/委托:一个对象请求另一个对象的功能        委派是复用的一种常见形式         一个简单例子:            正如一下所示:    Receiver 对象将操作委派给Delegate对象执行。    Client调用Receiver,而不使用Delegate对象    2.    利用委派可以扩展功能:    例如:我们要建立一个LoggingList,功能与...

qq_38969070的博客 2358

4.3面向复用的设计模式

除了Framework,4-2节所讨论的其他复用技术 都过于“基础”和“细小”,有没有办法做更大 规模的复用设计? 本节:介绍几种典型的“面向复用”的设计模式 大纲 ▪结构模式–适配器通过将自己的接口包装在现有类的周围,从而允许具有不兼容接口的类一起工作。 – Decorator在对象的现有方法中动态添加/覆盖行为。 – Facade为大量代码提供了简化的界面。 ▪行为模式–策略允许在运行时即时选...

weixin_43784537的博客 475

架构设计内容分享(九十):架构思维-复用

复用是架构思维中非常重要的思维之一,是面向对象架构设计的核心思想,业务能力组件化,组件能力服务化,共享平台,中台建设,公共服务下沉等都是为了提高系统的复用而设计。好的系统设计具备可扩展性(Extensibility)、灵活性(Flexibility)和可插入性(Pluggability),一个复用较好的系统,就是一个易维护的系统。但实际上,可维护性和可复用性是两个纬度。

之乎者也·的博客 1479

Java设计模式

设计模式可以使人们跟家简单方便的复用成功的设计和体系结构。将已证实的技术方案总结成设计模式,也会使其他开发证更加容易理解其设计思路。设计模式是可复用的面向对象软件的基础,帮助开发者做出有利于系统复用的选择,避免损害系统复用性的设计。目前所说的设计模式通常是指GoF设计模式。一共有23种设计模式。

qq_73164304的博客 139

Delegation and Inheritance(委派与继承)

委派(Delegation)是指一个对象请求另一个对象的功能,是复用的一种常见模式。一个简单的委派实例:在此例中,B类将foo()方法委派给A,让A的一个实例a来实现该方法。由此可见,委派模式通过运行时动态绑定,实现对其他类中代码的动态复用。委托依赖于动态绑定,因为它要求给定的方法调用可以在运行时调用不同的代码段。//这里实现动态绑定//这里进行功能委派LoggingList由一个List组成,并将(非日志记录)功能委托给该List。

Enzo Fernandez的博客 748

7.合成复用原则

文章目录一、定义二、分析1.合成复用原则概述2.复用的两种基本方法2.1 继承复用2.2 组合\聚合复用2.3注意事项三、实例1.解释名称2.引出问题3.合成复用原则重构 一、定义   合成复用原则又称为组合\聚合复用原则,其定义如下: 尽量使用对象组合,而不是继承来达到复用的目的。 二、分析 1.合成复用原则概述   合成复用原则就是指在一个新的对象里通过 关联关系(包括组合关系和聚合关系) 来使用一些已有的对象,使之成为新对象的一部分;   新对象通过委派调用已有对象的方法达到复用其已有功能的目的。简言

qq_43403759的博客 2081

[设计模式](六):装饰器模式(Decorator)和代理模式(Proxy)|委托模式(Delegater )

[设计模式](六):装饰器模式(Decorator)和代理模式(Proxy)|委托模式(Delegater )

身披白袍的博客 6746

JAVA 委派模式(Delegate)

委派模式(Delegate)是面向对象设计模式中常用的一种模式。这种模式的原理为类B和类A是两个互相没有任何关系的类,B具有和A一模一样的方法和属性;并且调用B中的方法,属性就是调用A中同名的方法和属性。B好像就是一个受A授权委托的中介。第三方的代码不需要知道A的存在,也不需要和A发生直接的联系,通过B就可以直接使用A的功能,这样既能够使用到A的各种公能,又能够很好的将A保护起来了。一举两得,岂不

mayaofr的专栏 1万+

java 回调与委派/委托机制

该例子是这样的(只是一个例子): ProfessionalWorker 、SparetimeWorker 负责发射 Rocket,Rocket 类通过接口 IRocketDelegate 委派(或者说是回调) ProfessionalWorker 、SparetimeWorker自己发射。 总之,Rocket不做具体的事情。看实例代码: IRocketDelegate.j

braddoris的专栏 5232

java 委派关系,区分委派,组合和聚合(Java OO设计)

I am facing a continuing problem distinguishing delegation, composition and aggregation from each other, and identifying the cases where it's the best to use one over the other.I have consulted a Java...

weixin_36432451的博客 323
上一篇: 软件构造第四章——复用软件评价与开发
下一篇: 软件构造第五章——面向可维护性的设计模式
入过栈你
博客等级 码龄7年 2粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值