设计模式—结构型模式
【前言】
结构型模式有:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式。
【内容】
适配器模式
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
优点
(1)可以让任何两个没有关联的类一起运行。
(2)提高了类的复用。
(3)增加了类的透明度。
(4)灵活性好。
缺点
(1)过多的使用适配器,会让系统非常凌乱,不易整体进行把握。
(2)只能适配一个适配者类,并且目标类必须是抽象类。
何时使用
(1)系统需要使用现有的类,而此类的接口不符合系统的需要。
(2)想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
(3)通过接口转换,将一个类插入另一个类系中。
适配器模式—UML图
实例
一个中国人要到国外去办事,但是他只会说中文,对方只会说英文,他们之前根本没有办法交流,这个时候就需要一个翻译来帮助他们进行沟通。其中,这个翻译就是适配器。
桥接模式
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
换句话说,抽象与它的实现部分分离,并不是让抽象类与其派生类分离,实现指的是抽象类和它的派生类用来实现自己的对象。
优点
(1)抽象和实现的分离。
(2)优秀的扩展能力。
(3)实现细节对客户透明。
缺点
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
何时使用
实现系统可能有多个角度分类,每一种角度都可能变化。
桥接模式—UML图
实例
其中,手机品牌和手机软件都是抽象类,让不同的品牌继承手机品牌,让不同的功能继承手机软件,各自独立,手机品牌包含有手机软件,但软件并不是手机品牌的一部分,所以它们之间是聚合关系。
组合模式
将对象组合成树形结构以表示‘部分-整体’的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
优点
(1)高层模块调用简单。
(2)节点自由增加。
缺点
在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
何时使用
(1)想表示对象的部分-整体层次结构
(2)希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
组合模式—UML图
装饰模式
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更加灵活。
优点
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点
多层装饰,结构复杂。
何时使用
在不想增加很多子类的情况下扩展类
装饰模式—UML图
外观模式
为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
优点
(1)减少系统相互依赖。
(2)提高灵活性。
(3)提高安全性
缺点
不符合开闭原则,如果要修改就很麻烦,重写或继承都不合适。
何时使用
(1)客户端不需要知道系统内部的复杂联系,整个系统只需提供一个“接待员”即可。
(2)定义系统的入口。
外观模式—UML图
享元模式
为运用共享技术有效地支持大量细粒度的对象。
优点
大大减少对象的创建,降低系统的内存,使效率提高。
缺点
提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。
何时使用
(1)系统中有大量对象。
(2)这些对象消耗大量内存。
(3)这些对象的状态大部分可以外部化。
(4)这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。
(5)系统不依赖于这些对象身份,这些对象是不可分辨的。
享元模式—UML图
代理模式
为其他对象提供一种代理以控制对这个对象的访问。
优点
(1)职责清晰。
(2)高扩展性。
(3)智能化。
缺点
(1)由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
(2)实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
何时使用
想在访问一个类时做一些控制。
代理模式—UML图