建设网站需要什么样的服务器,辽宁省住房和城乡建设厅网站打不开,企业网站的职能主要有,apache搭建多个网站前言
结构型设计模式#xff0c;主要研究#xff1a;
主要有哪些场景使用结构型设计模式#xff1b;每种场景应该使用何种设计模式#xff1b;以程序中的功能为核心#xff0c;研究程序功能的组织结构。所以这一章#xff0c;我们要把“功能结构”作为研究的核心。
下…前言
结构型设计模式主要研究
主要有哪些场景使用结构型设计模式每种场景应该使用何种设计模式以程序中的功能为核心研究程序功能的组织结构。所以这一章我们要把“功能结构”作为研究的核心。
下面分别对几种结构型模式加以说明。
1. 适配器模式
示例适配器模式
使用场景
想要在系统中添加某个功能类似的功能在其他项目中已经实现而且经过分析旧的接口可以经过适当的封装转换成新的适用于当前系统的接口。这样可以最大程度地复用已有的模块。
原理
通过适配器将已有功能的旧的接口转换为新的接口从而实现使已有的功能为新的系统服务的目的。
不适用的情况
以下情况下不要使用适配器模式
旧的接口无法转换成新的接口写适配器的工作量几乎可以重写所需的功能时。
使用须知
适配器模式其实是一种取巧的做法在使用时需要慎重考虑。已有功能通过适配器集成到新的系统后如果出现问题或者需要进行功能扩展其维护成本是一个需要考虑的问题。例如已有功能是否使用了过时的技术或者资料不全都可能成为项目的风险所在。
本质 适配器模式本质上是通过将一接口封装成另一种接口实现了模块功能复用。 2. 桥接模式
示例桥接模式
使用场景
桥接模式是少用继承多用组合的第一例。 拿菜鸟教程中的例子来说假如我们现在要实现圆类包括红色圆和绿色圆两种圆。 首先容易想到的方法是先写一个圆基类并添加一个虚(virtual)的绘制函数。然后分别派生出红色圆类和绿色圆类在子类中分别重新实现绘制函数将圆绘制成指定的颜色。 在这种简单的例子中使用继承是没什么问题的。但是假如圆基类还有一个虚函数此虚函数用于对圆进行旋转。旋转分为两种顺时针和逆时针旋转。我们想要四种类型的圆
顺时针旋转的红色圆顺时针旋转的绿色圆逆时针旋转的红色圆逆时针旋转的绿色圆
如何使用继承来实现呢难道要派生出四个子类吗如果还有其他功能组合呢要多少个类呢这样下去无疑会导致“类的数量爆炸”问题。
原理
结构型模式是研究程序功能组织方法的设计模式。当程序中需要对几种功能相互组合时应该用组合不要用继承。 桥接模式下对于每个功能应该提取出一个接口类这个接口类可以有不同的实现。而代表不同的功能接口可以作为主体类此例中为圆类的成员变量放在一起。需要什么功能就new哪种接口子类保存在接口变量中这样就可以把不同的功能组合起来。 这样一来类的数量会保持在最低水平。
相对于继承桥接模式相当于把主体类中的每个虚函数都单独提取出来构成 一个接口类。这个接口类连接了具体实现和主体类所以这个模式叫桥接模式。这个名字其实不是很能反映此模式的内涵其实叫“功能组合模式”更为贴切。
可能有的小伙伴会说上面的功能其实用C语言实现不是更简单吗
用一个结构体代表圆有半径、边框宽度等属性每种功能就是一个函数参数为圆的结构体。
这不就完成了吗是的 这个场景下确实使用C语言实现更简单不需要使用C面向对象的任何特性即可实现。可以看出C的面向对象的特性并不是万能的并不是在所有情况下都是最优的甚至有时候不如C语言简单直接。从另一个角度说明大家在面向对象编程的时候不要把自己的思维局限于面向对象面向对象思想在一些时候是不如面向过程的甚至会把功能结构复杂化设计到最后导致代码难以维护都是有可能的。
使用须知
桥接模式会导致代码中存在设计模式的代码会增加代码的理解难度。相对来说积极作用还是远大于副作用的。
本质
桥接模式的本质是 如果项目中出现了功能组合的场景使用继承封装功能是错误做法要把功能单独提取出来分别封装好以后再进行组合。 3. 过滤器模式
示例过滤器模式
使用场景
现有一组对象我们想要根据不同的过滤条件筛选出符合条件的一部分对象。
一般写法
最简单粗暴的方法是在需要进行筛选过滤的地方直接遍历对象数组在循环体内进行条件判断。这种写法的优点是简单直接缺点是如果有多个地方需要使用筛选过滤功能则需要在多个地方编写重复的代码这会降低代码的复用性和可维护性。
推荐写法
使用过滤器模式把筛选功能封装起来使用即可。接口也很好定义输入对象数组输出符号条件的对象数组。
本质
过滤器模式的本质是 当需要从一组对象中过滤出一部分符合条件的对象时可以考虑将每种过滤功能都封装为一个类提高代码复用性和可维护性。 4. 组合模式
示例组合模式
组合模式是一种树形的对象组织结构在建造者模式已有相关说明这里不再赘述。
5. 装饰器模式
示例装饰器模式
使用场景
装饰器模式的研究对象有两个
已有功能扩展功能
当我们需要扩展一个类的功能但是又不想直接在此类上进行改动时一般的做法是使用继承来实现。继承出来的子类具有父类的属性和方法在父类基础上可以添加新的功能。 除了继承还可以使用装饰器模式。装饰器模式是指新建一个扩展类将被扩展类的对象作为扩展类的成员变量保存在扩展类中操作被扩展类实现新的方法和功能。 简单来说装饰器模式就是新建一个类把已有类的功能包装起来实现新的功能。
使用须知
装饰器模式和继承各有优缺点使用时要加以权衡选择最优的方案。
本质
从本质上说 装饰器模式通过将已有功能作为成员变量整个封装包装起来扩展的新功能和已有功能耦合最小互不影响。 6. 外观模式
示例装饰器模式
本质
这个模式比较简单不再赘述。其本质是 将已有功能封装起来提供更易于使用的接口屏蔽更多实现细节等于是加了一个中间层。 7. 享元模式
示例享元模式
按照我们的分类此模式应该属于创建型模式。它是借助工厂模式来实现一个对象缓冲池减少对象数量 加速创建速度。这里不再赘述。
8. 代理模式
示例代理模式
应用场景
代理模式就是中介模式。例如我们想要租房原本租房是发生在租客和房东之间的事务但中介的出现虽然会有一定的费用损耗但是整个过程的推进会更加顺利。代理模式用来将两个比较难以直接沟通的功能主体关联起来实现二者交互。
使用须知
和租房找中介一样只有在必要的时候才找否则就是浪费资源只有在非用不可的时候才建议使用代理模式。
本质
代理模式的本质是 代理模式封装了沟通所需的所有功能将两个难以直接沟通的功能主体连接起来起到了桥梁作用。 结语
结构型模式就是以功能为核心研究功能转换、功能调用、功能组合、功能封装等各种情形下将哪些功能封装到哪些类中更加高效地实现需求提升代码的可维护性。