设计模式应试复习篇(四)——举例说明7种结构型模式的适用情景

1、适配器模式(别名为包装器)

考虑这样一种情况,我们要给电脑充电,教室里正好有一个可以充电的插头,但是插头是两孔的,虽然这个插头可以通电,但是我们却没有办法直接用,我们需要一个插板,这个插板是两孔的,插板可以连接电脑的三孔插头和电源的两孔插头,起到的就是适配器的作用。

适配器模式的优点:

将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码。 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。

类适配器模式的缺点如下: 对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口。

2、桥接模式(又称为柄体(Handle and Body)模式或接口(Interface)模式)

假如我们需要大中小3种型号的画笔,能够绘制12种不同的颜色,如果使用蜡笔,需要准备3×12 = 36支,但如果使用毛笔的话,只需要提供3种型号的毛笔,外加12个颜料盒即可,涉及到的对象个数仅为 3 + 12 = 15,远小于36,却能实现与36支蜡笔同样的功能。如果增加一种新型号的画笔,并且也需要具有12种颜色,对应的蜡笔需增加12支,而毛笔只需增加一支。

桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化,用类之间的对象关系取代了继承关系,更有利于扩展。

桥接模式的主要优点是分离抽象接口及其实现部分,是比多继承方案更好的解决方法,桥接模式还提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,实现细节对客户透明,可以对用户隐藏实现细节;其主要缺点是增加系统的理解与设计难度,且识别出系统中两个独立变化的维度并不是一件容易的事情。

3、组合模式(又可以称为“整体-部分”(Part-Whole)模式)

我们在电脑中找寻特定的文件的时候,其实是从一个父类元素一级一级向下查找的,这实际上是一个树形结构,树形结构就有叶节点和非叶节点,他们肯定具有不同的功能,可是很多时候我们希望能够没有区别地处理他们,这就是组合模式的动机。

组合模式的主要优点在于可以方便地对层次结构进行控制,客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关心自己处理的是单个对象还是整个组合结构,简化了客户端代码;其缺点在于使设计变得更加抽象,且增加新构件时可能会产生一些问题,而且很难对容器中的构件类型进行限制。

4、装饰模式

参考新房子装修的过程,当我们想要房子更漂亮的时候,比如我们想要一个这个房子带有水晶吊灯,我们不是再重新盖一个带有水晶吊灯的房子,这是子类继承父类的扩展模式,我们会选择在现有房子的基础上不断添加我们所需要的东西,这就是装饰模式。装饰器使用对象之间的关联关系取代类之间的继承关系,在装饰器中既可以调用原有类的方法,还可以增加新的方法,以扩充原有类的功能。它通过一种无须定义子类的方式来给对象动态增加职责,符合合成复用原则。

装饰模式适用情况包括:在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责;需要动态地给一个对象增加功能,这些功能也可以动态地被撤销;当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。

5、外观模式

想组装一台新电脑,一个方案是去电子市场把自己需要的配件都买回来,然后自己组装,但需要对各种配件都要比较熟悉,这样才能选择最合适的配件,而且还要考虑配件之间的兼容性;另外一个方案,就是到电子市场,找一家专业装机的公司,把具体的要求一讲,然后就等着拿电脑就好了,方案二就是外观模式,装机公司,就是所谓的外观角色,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度。

外观模式适用情况包括:要为一个复杂子系统提供一个简单接口;客户程序与多个子系统之间存在很大的依赖性;在层次化结构中,需要定义系统中每一层的入口,使得层与层之间不直接产生联系。

6、享元模式

想一想软件开发中常见的字符串,一个文本字符串中往往存在很多重复的字符,如果每一个字符都用一个单独的对象来表示,将会占用较多的内存空间。 这时就可以通过享元模式实现相同或相似对象的重用。在逻辑上每一个出现的字符都有一个对象与之对应,然而在物理上它们却共享同一个享元对象,这个对象可以出现在一个字符串的不同地方,相同的字符对象都指向同一个实例。

享元模式适用情况包括:一个系统有大量相同或者相似的对象,由于这类对象的大量使用,造成内存的大量耗费;对象的大部分状态都可以外部化,可以将这些外部状态传入对象中;多次重复使用享元对象。

7、代理模式

类比代购,我们因为某种原因比如不想走远路或者根本去不了目的地买不到所需商品,这时我们把钱交给代购,代购去目的地付款,然后商家可以快递发给我们,这种情况就是代理模式。

代理模式的优点在于能够协调调用者和被调用者,在一定程度上降低了系统的耦合度;其缺点在于由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢,并且实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

猜你喜欢

转载自blog.csdn.net/qq_40996041/article/details/83582497