天天看点

设计模式--结构型模式比较

        结构型模式为了组合类和对象以获得更大的结构而产生的一种指导性方法。(A structural design pattern serves as a blueprint for how different classes and objects are combined to form larger structures.)与创建型模式不同的是,后者是为了实现一个统一的目标,即是系统独立于如何创建、组合和表示它的对象。而结构型模式是为了实现不同的目标而引入的。

        结构类模式是通过继承来实现类接口和实现的组合,这种模式是极少的。而结构对象模型是通过对象组合来实现多对象方法的组合。结构对象模式是常用的结构型模式。

        GoF将结构模式分为了7种,包括:桥接模式、适配器模式、装饰模式、组合模式、外观模式、享元模式和代理模式。下面将通过类图的方式给出每个模式的具体实现(希望大家对类图有一定的了解)。

       桥接(Bridge)模式:将抽象部分与它的实现分离,使它们可以独立的变化。(注意桥接模式与其他模式的混合使用,如AbstractFactory)

设计模式--结构型模式比较

        适配器(Adapter)模式:将一个类的接口转换为客户希望的另一个接口,其可以是原本由于接口不兼容不能在一起工作的那些类可以一起工作。值得注意的是适配器模式有两种实现方式:

        参与者:Target、Client、Adaptee、Adapter

        1. 类适配器:Adapter同时继承Target和Adaptee,在Adapter中使用Adaptee的具体方法实现Target中的请求方法。(公有继承Target、私有继承Adaptee)

        2. 对象适配器:Adapter只继承Target,并在类中包含Adaptee的对象,通过对Adaptee对象方法的调用实现Target的方法请求。

设计模式--结构型模式比较
设计模式--结构型模式比较

      装饰(Decorator)模式:动态的给一个对象添加一些额外的职责。

设计模式--结构型模式比较

        参与者:Component、ConcreteComponent、Decorator、ConcreteDerator

        具体实现:Decorator继承Component,并包含Component对象指针

int main()
{
   Component *com = new Component();
   Decorator *dec = new Decorator(com);
   dec -> Operation(); //在operation中实现Component的老方法并加入新加入的功能
}
           

        组合(Composite)模式:将对象的组合成树形结构以表示“部分-整体”的层次结构。需要指出的是组合模式与装饰模式具有相似的形式化表示,但是二者的侧重点和用途却大不相同。组合模式更侧重于对象的表示,而装饰模式更注重对象功能的扩展;二者都维护着指向父类的指针,但是装饰模式是用此来运行时指定原有的功能,而组合模式是运行时指定对象的组合。

设计模式--结构型模式比较

       外观(Facade)模式:为系统中的一组接口提供一个一致的界面。

       实现:外观类包含所有子系统的对象指针和一个方法包装接口,在该接口中实现子系统中的全部的子接口。

设计模式--结构型模式比较

       享元(Flyweight)模式:运用共享技术有效地支持大量细粒度的对象。享元模式的重点是引入了外部特征和内部特征的概念,具体的享元子类通过集成父类的内部特征并加入自身的外部特征生成更多的子类。用户通过向享元工厂传入不同的键值来索引不同的享元子类。

设计模式--结构型模式比较

         代理(Proxy)模式:为其他对象提供一种代理以控制对这个对象的访问。代理模式相当于用户不直接访问功能对象接口,而是通过代理对象间接访问。

设计模式--结构型模式比较

注:类图摘自《C++设计模式》