结构型设计模式

简介: 结构型设计模式

设计模式

结构型设计模式

代理模式

  • 代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问.
  • 静态代理(强制代理)
  • 抽象主题(StaticSubjectInt):定义了主题的规范、接口
  • 真实主题(RealSubject):实现了抽象主题做的事,是代理者最后代理的对象
  • 代理者(StaticProxy):提高了与真实主题一样的接口,内部引用了真实主题,能够对真是主题的访问权限进行控制
  • 静态代理的优点、缺点
  • 缺点:
  • 静态代理通过实现高层接口来实现代理模式(如果n个实现代理,则需要n个代理者)
  • 代理者与实现者存在着许多代码一致性
  • 优点:
  • 保护真实工作者
  • 易拓展目标对象
  • 解耦(客户与目标对象分离)
  • 动态代理
  • 抽象主题(Subject):定义了业务的高层接口
  • 具体主题(RealSubject):实现了业务高层接口(具体工作者)
  • 代理者(ProxyInvocation):基于JDK默认代理实现了InvocationHandler接口
  • 优点:
  • 不需要实现高层业务接口(与静态代理相比,进一步解耦)
  • 能够在运行时改变改变代理者(相对于静态代理)
  • JDK动态代理方法

/**

* ClassLoader loader:获取需要代理的类的类加载器

* Class<?>[] interfaces:需要代理类的实现的接口列表(因此动态代理又称接口代理)

* InvocationHandler h:将任务分配给具体做事的程序

*/

publicstaticObjectnewProxyInstance

       (ClassLoaderloader,

       Class<?>[]interfaces,

       InvocationHandlerh)

适配器模式

  • 适配器模式的定义:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作.
  • 适配器模式
  • 目标(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)角色 / 中间构件:是组合中的分支节点对象,它有子节点,用于继承和实现抽象构件.它的主要作用是存储和管理子部件.
  • 安全模式与透明模式去的区别
  • 安全模式将接口的规范进行了缩小,对于树干、树叶来说,实现的方法不一致,客户需要知道构件细节,牺牲了透明性
  • 透明模式将规范统一在接口,对于树叶来说,不需要进行管理操作,因此需要在树叶的操作方法里进行其余的处理(外抛异常......)
  • 组合模式的优点、缺点
  • 优点
  • 使客户方便的处理一个或多个对象,简化了客户端使用
  • 容易添加对象,无需修改源码,符合开闭原则
  • 缺点
  • 设计复杂
  • 增加了系统复杂性
目录
相关文章
|
7月前
|
设计模式 程序员
结构型设计模式之适配器模式
结构型设计模式之适配器模式
|
7月前
|
设计模式
结构型设计模式之装饰模式
结构型设计模式之装饰模式
|
7月前
|
设计模式 编解码 网络安全
结构型设计模式之代理模式
结构型设计模式之代理模式
|
8月前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式
[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式
|
8月前
|
设计模式 安全 Java
[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式
[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式
|
8月前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
|
8月前
|
设计模式 存储 缓存
第三篇 结构型设计模式 - 简化复杂系统的结构
第三篇 结构型设计模式 - 简化复杂系统的结构
|
8月前
|
设计模式 存储 Java
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
|
8月前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~结构型]处理多维度变化——桥接模式
[设计模式Java实现附plantuml源码~结构型]处理多维度变化——桥接模式
|
8月前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~结构型]对象的间接访问——代理模式
[设计模式Java实现附plantuml源码~结构型]对象的间接访问——代理模式

热门文章

最新文章

  • 1
    设计模式转型:从传统同步到Python协程异步编程的实践与思考
    64
  • 2
    C++一分钟之-设计模式:工厂模式与抽象工厂
    55
  • 3
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    65
  • 4
    C++一分钟之-C++中的设计模式:单例模式
    80
  • 5
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    52
  • 6
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    82
  • 7
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    70
  • 8
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    54
  • 9
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    63
  • 10
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    137