07适配器与组合模式

发布时间 2023-04-24 21:19:43作者: vbig

结构型模式

  • 定义

    1. 结构型模式(Structural Pattern)关注如何将现有类或对象组织在一起形成更加强大的结构
    2. 不同的结构型模式从不同的角度组合类或对象,它们在尽可能满足各种面向对象设计原则的同时为类或对象的组合提供一系列巧妙的解决方案
  • 两大类

    1. 类结构型模式
      • 关心类的组合,由多个类组合成一个更大的系统,在类结构型模式中一般只存在继承关系和实现关系
    2. 对象结构型模式
      • 关心类与对象的组合,通过关联关系,在一个类中定义另一个类的实例对象,然后通过该对象调用相应的方法
  • 结构模式详细分类
    Pasted image 20230320085806


适配器模式

  • 定义

    1. 将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作
    2. 对象结构型模式 / 类结构型模式
    3. 别名为包装器(Wrapper)模式
    4. 定义中所提及的接口是指广义的接口,它可以表示一个方法或者方法的集合
  • 简单结构:3个角色

    1. Target(目标抽象类)
    2. Adapter(适配器类)
    3. Adaptee(适配者类)
  • UML

  1. 适配器模式的结构(类适配器)
    Pasted image 20230320090148
    实现和继承

  2. 适配器模式的结构(对象适配器)
    Pasted image 20230320090314
    继承和关联

适配器模式---缺省适配器模式

  • 定义:当不需要实现一个接口所提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可以选择性地覆盖父类的某些方法来实现需求,它适用于不想使用一个接口中的所有方法的情况,又称为单接口适配器模式

  • UML

Pasted image 20230320091105

适配器模式---双向适配器

  • UML

Pasted image 20230320091314

  • 适配器模式优缺点

    1. 优点:
      • 将目标类和适配者类解耦
      • 增加了类的透明性和复用性
      • 灵活性和扩展性非常好
    2. 缺点:
      • 类适配器模式:
        1. 一次最多只能适配一个适配者类,不能同时适配多个适配者;(因为单继承)
        2. 适配者类不能为最终类;
        3. 目标抽象类只能为接口,不能为类
      • 对象适配器模式:在适配器中置换适配者类的某些方法比较麻烦
  • 适配器模式适用环境

    1. 系统需要使用一些现有的类,而这些类的接口不符合系统的需要,甚至没有这些类的源代码
    2. 创建一个可以重复使用的类,用于和一些彼此之间没有太大关联的类,包括一些可能在将来引进的类一起工作

组合模式

  • 定义

    1. 组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象。
    2. 对象结构型模式
    3. 又称为“部分-整体”(Part-Whole)模式
    4. 将对象组织到树形结构中,可以用来描述整体与部分的关系
  • 简单结构:3个角色

    1. Component(抽象构件)
    2. Leaf(叶子构件)
    3. Composite(容器构件)
  • UML

Pasted image 20230320094604

组合模式---透明组合模式

  • 抽象构件Component中声明了所有用于管理成员对象的方法,包括add()、remove(),以及getChild()等方法

  • 在客户端看来,叶子对象与容器对象所提供的方法是一致的,客户端可以一致地对待所有的对象

  • 缺点是不够安全,因为叶子对象和容器对象在本质上是有区别的

  • UML

Pasted image 20230320100443

组合模式---安全组合模式

  • 抽象构件Component中没有声明任何用于管理成员对象的方法,而是在Composite类中声明并实现这些方法

  • 对于叶子对象,客户端不可能调用到这些方法

  • 缺点是不够透明,客户端不能完全针对抽象编程,必须有区别地对待叶子构件和容器构件

  • UML

Pasted image 20230320100518

  • 组合模式的优缺点

    1. 优点:
      • 可以清楚地定义分层次的复杂对象
      • 客户端可以一致地使用一个组合结构或其中单个对象,简化了客户端代码
      • 增加新的容器构件和叶子构件都很方便,符合开闭原则
      • 为树形结构的面向对象实现提供了一种灵活的解决方案
    2. 缺点:
      • 在增加新构件时很难对容器中的构件类型进行限制
  • 组合模式的适用环境

    1. 具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们
    2. 在一个使用面向对象语言开发的系统中需要处理一个树形结构
    3. 在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型