1 Star 2 Fork 0

yanyingbai / SourceCode

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
结构型设计模式.md 7.45 KB
一键复制 编辑 原始数据 按行查看 历史
yanyingbai 提交于 2022-07-21 22:00 . 命令模式

设计模式

结构型设计模式

代理模式

  • 代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问.
  • 静态代理(强制代理)
    • 抽象主题(StaticSubjectInt):定义了主题的规范、接口
    • 真实主题(RealSubject):实现了抽象主题做的事,是代理者最后代理的对象
    • 代理者(StaticProxy):提高了与真实主题一样的接口,内部引用了真实主题,能够对真是主题的访问权限进行控制
  • 静态代理的优点、缺点
    • 缺点:
      • 静态代理通过实现高层接口来实现代理模式(如果n个实现代理,则需要n个代理者)
      • 代理者与实现者存在着许多代码一致性
    • 优点:
      • 保护真实工作者
      • 易拓展目标对象
      • 解耦(客户与目标对象分离)
  • 动态代理
    • 抽象主题(Subject):定义了业务的高层接口
    • 具体主题(RealSubject):实现了业务高层接口(具体工作者)
    • 代理者(ProxyInvocation):基于JDK默认代理实现了InvocationHandler接口
  • 优点:
    • 不需要实现高层业务接口(与静态代理相比,进一步解耦)
    • 能够在运行时改变改变代理者(相对于静态代理)
  • JDK动态代理方法
/**
 * ClassLoader loader:获取需要代理的类的类加载器
 * Class<?>[] interfaces:需要代理类的实现的接口列表(因此动态代理又称接口代理)
 * InvocationHandler h:将任务分配给具体做事的程序
 */
public static Object newProxyInstance
        (ClassLoader loader,
        Class<?>[]interfaces,
        InvocationHandler h)

适配器模式

  • 适配器模式的定义:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作.
  • 适配器模式
    • 目标(Power、UsbPower、TypeCPower):描述了具体业务,可以是具体接口,也可以是实现类
    • 适配者(PowerAdaptee,UsbAdaptee,TypeCAdaptee):被访问的对象、适配现存目标的接口
    • 适配器(PowerAdapter):一个转换器,通过引用或者继承适配者对象,把适配者转化为目标接口
  • 适配器模式的优点、缺点
    • 优点
      • 透明的调用了目标接口
      • 复用了现存的类,不需要修改原有代码而重用现存的适配者
      • 允许不兼容对象通信
    • 缺点
      • 适配器需要结合具体场景分析,增加了系统的复杂性
      • 代码阅读困难

桥接(Bridge)模式

  • 桥接模式的定义:将一个复杂的组件拆成两个独立又相关的继承层次结构:功能性的抽象和内部实现(人话:抽象与实现分离,使它们独立变化)
  • 桥接模式
    • 抽象化角色(Bag):定义抽象类,并包含一个对实现化角色(Color)的引用
    • 抽象化角色拓展(BookBag,ComputerBar):属于抽象化角色的子类,实现父类的方法
    • 实现化角色(Color):定义实现化角色的接口,供扩展抽象化角色调用
    • 具体实现类(BlueColor,RedColor):给出实现化角色的具体实现
  • 桥接模式的优点、缺点
    • 优点
      • 抽象与实现分离,扩展能力强
      • 其实现细节对客户透明
    • 缺点
      • 增加了系统复杂性
      • 需要设计者识别可变抽象者的独立维度(能够识别抽象对象的可变属性)

装饰器(Decorator)模式

  • 装饰器模式定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责.
  • 装饰器模式
    • 抽象构建(People):描述了一个具有基本规范职责的对象接口
    • 具体构建角色(ConCreatePeopleWoman,ConCreatePeople):实现了抽象构建
    • 抽象装饰(Decorator):实现了抽象构建,并且包含了具体构建的实例,通过子类拓展具体构建
    • 具体装饰(ConCreateDecorator,ConCreateDecorator2,ConCreateDecoratorPlay):实现抽象装饰的方法,并未具体构建添加责任
  • 装饰器模式的优点、缺点
    • 优点:
      • 比继承拓展更灵活,代码侵入更低
      • 可以对构建角色、装饰者进行组合
    • 缺点:
      • 类的数目变多,增加系统复杂性

外观(Facade)模式

  • 外观模式定义:通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式
  • 外观模式
    • 外观(Facade)角色:为多个子系统提供共用的接口(客户访问的对象)
    • 子系统(SubSystem)角色:实现系统的部分功能,客户可以通过外观角色访问它
  • 外观模式的优点、缺点
    • 优点
      • 降低了不同的子系统与客户的耦合关系
      • 子系统的更改不会影响客户端
      • 减少了客户端创建对象的数目
    • 缺点
      • 不能很好的限制子系统
      • 对子系统的增加,需要修改外观角色,不符合开闭原则

享元(Flyweight)模式

  • 享元模式定义: 运用共享技术来有效地支持大量细粒度对象的复用.它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率
  • 享元模式
    • 抽象享元角色(AbatractFlyweight):所有具体享元的基类,非享元通过参数传递
    • 具体享元(ConCreateFlyweight1,ConCreateFlyweight2):实现抽象享元的接口
    • 非享元(NotShareFlyweight):不共享的状态
    • 享元工厂(FlyweightFactory):负责创建、管理享元对象
  • 享元模式的优点、缺点
    • 优点
      • 减少需要处理的对象数目
      • 如果对象能够持续,减少内存消耗(本质就是缓存共享对象,减少内存消耗)
    • 缺点
      • 读取享元对象耗时间
      • 外部化非享元对象,增加系统复杂性

组合模式

  • 组合模式定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式.
  • 组合模式
    • 安全模式
    • 透明模式
      • 抽象构件(Component)角色:定义了树叶、树干需要实现的基础方法
      • 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于继承或实现抽象构件.
      • 树枝构件(Composite)角色 / 中间构件:是组合中的分支节点对象,它有子节点,用于继承和实现抽象构件.它的主要作用是存储和管理子部件.
    • 安全模式与透明模式去的区别
      • 安全模式将接口的规范进行了缩小,对于树干、树叶来说,实现的方法不一致,客户需要知道构件细节,牺牲了透明性
      • 透明模式将规范统一在接口,对于树叶来说,不需要进行管理操作,因此需要在树叶的操作方法里进行其余的处理(外抛异常......)
  • 组合模式的优点、缺点
    • 优点
      • 使客户方便的处理一个或多个对象,简化了客户端使用
      • 容易添加对象,无需修改源码,符合开闭原则
    • 缺点
      • 设计复杂
      • 增加了系统复杂性
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/BeliveLove/source-code.git
git@gitee.com:BeliveLove/source-code.git
BeliveLove
source-code
SourceCode
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891