4.3面向复用的设计模式

除了Framework,4-2节所讨论的其他复用技术 都过于“基础”和“细小”,有没有办法做更大 规模的复用设计?
本节:介绍几种典型的“面向复用”的设计模式
大纲
▪Adapter模式–适配器通过将自己的接口包装在现有类的周围,从而允许具有不兼容接口的类一起工作。
– Decorator在对象的现有方法中动态添加/覆盖行为。
– Facade为大量代码提供了简化的界面。
▪行为模式–策略允许在运行时即时选择一系列算法中的一种。
–模板方法将算法的框架定义为抽象类,从而允许其子类提供具体的行为。
–迭代器顺序访问对象的元素,而不会暴露其基础表示。
为什么要重用设计模式?
一个好的设计应该能够灵活地进行更改(可重用性),在解决旧问题时将新问题的引入减至最少(可维护性),允许在初次交付后交付更多功能(可扩展性)。
设计模式:在软件设计中给定上下文中对常见问题的通用可重用解决方案。 OO设计模式通常显示类或对象之间的关系和交互,而无需指定最终的应用程序类或对象。

设计模式分类法
▪创建型模式–关注对象的创建过程
▪结构模式–处理类或对象的组成
▪行为模式–描述类或对象交互和分配责任的方式。

1适配器模式
(1) Adapter
▪ 意图:将一个类的接口转换成客户端希望获得的另一个接口。
–适配器允许类协同工作,否则由于接口不兼容而无法协同工作。
–用新接口包装现有类。
▪ Object对象:将旧组件重用到新系统(也称为“包装器”)

在这里插入图片描述
适配器模式可以分为继承和委托

在这里插入图片描述

举例:▪ LegacyRectangle的display()方法期望接收“x,y,w,h”参数,但客户端希望用左上角坐标和右下角坐标来构造,这就可以通过适配器来解决。

在这里插入图片描述

适配器模式总结:当客户端需要通过不同的参数构造同一种对象时,可以通过该对象的抽象类构造一个适配器类来进行构造。

(2) Decorator
装饰器模式:设想你需要几种不同的堆栈:
–undo Stack:一个允许您撤消以前的推送或弹出操作的堆栈–SecureStack:一个需要密码的堆栈
–SynchronizedStack:一个序列化并发访问的堆栈
假如需要不同的特性组合堆栈呢?
SecureUndoStack:需要密码的堆栈,允许撤消SynchronizedUndoStack:序列化并发访问的堆栈,撤消

如果每一种都单独写的话会发生组合爆炸和大量的代码重复,我们需要装饰者模式:当我们需要为对象增加不同的特性时,可以对每一个“特性"构造子类通过委派机制增加到对象上。

在这里插入图片描述
装饰者和被装饰者具有公共接口,公共基础的操作放在ConcreteComponent中,在其基础上增加装饰。所有装饰类都有一各个抽象的装饰父类,它实现组件接口,构造时必须传入基础组件component。可以添加任意需要添加的装饰类。如果需要多种装饰,通过一层一层的装饰即可实现。

装饰与继承
▪ Decorator在运行时组合特性
-继承在编译时组合特性
▪ Decorator由多个协作对象组成
——继承产生一个清晰类型的对象
▪ 可以混合和匹配多个装饰
-多个继承在概念上是困难的

装饰者模式在java中的应用:
在这里插入图片描述
(3) Facade
外观模式
需求:客户端需要通过一个简化的接口来访问复杂系统内的功能
Facade定义了一个更高级的接口,是子系统接口的统一接口,使子系统更易于使用,减少使用子系统的学习成本,将子系统与潜在客户端的解耦。在这里插入图片描述
▪ 假设我们有一个带有一组接口的应用程序来使用MySql/Oracle数据库并生成不同类型的报告,例如HTML报告、PDF报告等。
▪ 因此,我们将有不同的接口集来处理不同类型的数据库。
▪ 现在客户端应用程序可以使用这些接口来获取所需的数据库连接并生成报告。
▪ 但是,当复杂性增加或接口行为名称混乱时,客户端应用程序将发现很难管理它。
▪ 因此,我们可以在这里应用Facade模式,并在现有接口的基础上提供一个包装器接口来帮助客户机应用程序。

2.行为模式
(1) Strategy
策略模式
需求:对同一个任务存在不同的算法,客户端需要在程序运行时根据动态上下文切换不同的算法。
解决方案:为算法创建一个接口,每个针对该任务的不同算法都有一个实现类。
优点:易于扩展的新算法实现将算法与客户端上下文分离。
在这里插入图片描述
(2) Template Method
模板模式
需求:多个客户端的算法相同,但是细节步骤上不同,例如读取文件,都包括打开文件,读取文件,关闭文件三个步骤,但是如何进行则有所不同。具有共性的步骤在抽象类中公共实现,差异化的步骤在子类中实现。
▪ 模板方法模式使用继承+可重写方法来改变算法的一部分,而策略模式使用委托来改变整个算法(接口和特殊多态性)。 、 ▪ 模板方法广泛应用于框架中—,框架实现了算法的不变量—,客户端定制为算法提供了专门的步骤
在这里插入图片描述
(3) Iterator 迭代器模式
需求:客户端需要根据某种策略访问容器中的所有元素,而不依赖于容器类型
解决方案:迭代的策略模式,隐藏底层容器的内部实现,支持具有统一接口的多个遍历策略,易于更改容器类型,促进程序各部分之间的通信
▪ 模式结构
-抽象迭代器类定义遍历协议
-每个聚合类的具体迭代器子类
-聚合接口创建迭代器对象的实例
-聚合实例保留对迭代器对象的引用
在这里插入图片描述
▪ Iterable接口:实现该接口的容器对象是可迭代遍历的
在这里插入图片描述
在这里插入图片描述
▪ Iterator pattern:让自己的集合类实现Iterable接口,并实现自己的 独特Iterator迭代器(hasNext, next, remove),允许客户端利用这 个迭代器进行显式或隐式的迭代遍历:
在这里插入图片描述
hasNext方法返回是否有下一个元素,next方法返回下一个元素,remove方法移除当前元素

▪ 结构模式(Structural patterns)
–适配器模式允许具有不兼容接口的类通过将自己的接口包装在已经存在的类的接口上一起工作。
–Decorator装饰者在对象的现有方法中动态添加/重写行为。
–Facade外观模式为大量代码提供了一个简化的接口。
▪ 行为模式
-策略模式允许在运行时动态选择一系列算法中的一个。
–Template方法将算法的框架定义为抽象类,允许其子类提供具体的行为。
–迭代器模式按顺序访问对象的元素,而不公开其底层表示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值