设计模式详解--结构型

结构型

  • 共7种
  • 适配器、装饰、代理、外观、桥接、组合、享元

适配器模式

  • 概念

    将一个类的接口转换为客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

  • 优点

    • 将目标类和和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无需修改原有代码
    • 增加了代码的透明性和复用性,将具体的实现封装在适配者类中,对于客户端来说是透明的,而且提高了适配者的复用性
    • 灵活性和扩展性都比较好,通过配置文件,可以方便的更换适配器,也可以在不修改原有代码的基础上增加新的适配器,符合开闭原则
  • 缺点

    • 对于java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标只能是接口,不能是类,其使用有一定的局限性,不能将一个适配者类和它的子类同时适配到目标接口
  • 使用场景★★★★☆

    • 需要使用现有的类,而这些类的接口不符合系统的需要
    • 想要建立一个可以重复使用的类,用于一些彼此没有太大关联的类一起工作


      适配器.png

组合模式

  • 概念

    将对象组合成树形结构以表示’部分-整体‘的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性

  • 优点

    • 组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或不分层次,使得增加新构件也变得容易
    • 客户端调用简单,客户端可以一致的使用组合结构或其中单个对象
  • 缺点

    • 使设计变得更加抽象,不是所有方法与叶子对象子类都有关联
    • 增加新构件可能会产生一些问题。有时候我们希望一个容器中只能有某些特定类型的对象,使用组合模式时不能依赖类型系统来施加这些约束,因为他们都来自相同的抽象层,必须通过在运行时进行类型检查来实现,实现过程会变得复杂
  • 使用场景★★★★☆

    • 需要表示一个对象整体和部分层次。在这种层次结构中,希望忽略整体和部分的差异,可以一致对待


      组合.png

代理模式

  • 概念

    为其他对象提供一种代理以控制对这个对象的访问

  • 优点

    • 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度
  • 缺点

    • 在客户端和真是主题之间增加了代理对象,因此有些类型的代理可能会造成请求处理变慢
    • 实现代理需要额外的工作,有些代理模式实现特别复杂
  • 使用场景★★★★☆

    远程代理、虚拟代理、保护代理等


    代理.png

装饰模式

  • 概念

    动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活

  • 优点

    • 可以提供比继承关系更多的灵活性
    • 可以使用不同的装饰类排列组合,创造出很多不同的行为组合
    • 具体构件类和具体装饰类可以独立变化,用户可以灵活新增并自由组合,符合开闭
  • 缺点

    • 会产生许多小对象,增加系统复杂度
    • 比继承更灵活,也就意味着比继承更容易出错,排错也困难
  • 使用场景★★★☆☆

    • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加指责
    • 不能继承或者继承不利于系统扩展和维护时


      装饰.png

外观模式

  • 概念

    为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用

  • 优点

    • 完美地体现了依赖倒置原则和迪米特法则的思想
    • 对客户屏蔽子系统组件。客户端代码变得较少,与之关联的对象也很少
    • 实现了子系统与客户端的松耦合,降低了编译依赖性
  • 缺点

    • 在不引入抽象外观类的情况下,新增子系统时可能需要修改外观类或客户端的源代码
  • 使用场景★★★★★

    • 为复杂系统提供简单接口
    • 客户程序与多个子系统之间存在很大的依赖性
    • 在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间通过外观类建立联系,降低层之间的耦合度


      外观.png

桥接模式

  • 概念

    将抽象部分与它的实现分离,使他们可以独立地变化

  • 优点

    • 分离抽象接口及其实现部分,使其可以沿着各自的维度来变化
    • 桥接模式提高了系统的可扩展性,在两个变化维度人以扩展,都不需要修改原系统
  • 缺点

    • 增加系统的理解和设计难度
    • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其适用范围有一定的局限性
  • 使用场景★★★☆☆

    • 一个类存在两个独立变化的维度,且这两个维度都需要扩展
    • 如果系统想要在抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系


      桥接.png

享元模式

  • 概念

    运用共享技术有效地支持大量细粒度的对象

  • 优点

    • 它可以极大减少内存中对象的数量,使得相同或相似对象在内存中只保存一份
    • 享元模式外部状态相互独立,而且不会影响内部状态,,从而享元模式可以被不同环境共享
  • 缺点

    • 享元模式使得系统更加复杂,需要分离出内部状态和外部状态,逻辑复杂化
    • 为了是对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长
  • 使用场景★☆☆☆☆

    • 一个系统拥有大量相同或相似的对象,由于这些对象的大量使用,造成内存的大量耗费
    • 对象的大部分状态都可以外部化,可以将这些外部状态传入对相爱那个中
    • 需要维护一个存储享元对象的享元池,这需要耗费资源,因此当多次重复使用享元对象时,才值得用享元模式


      享元.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。