(2)结构型设计模式

结构型模式:

共七种:适配器模式装饰器模式代理模式外观模式桥接模式组合模式享元模式

下面是UML的结构图 (重要的东西记在心上

结构型设计模式.jpg

下面从定义应用实例模式优缺点以及源码体现探讨设计模式。

适配器模式

适配器模式定义:将一个类的转接口转换成客户希望的另外一个接口,适配器模式使得原来由于接口不兼容的而不能的工作的那些类可以工作
应用实例:插头转换,编码解码
优点

  • 将目标类和适配者类解耦
  • 灵活性和扩展性都非常好,完全符合“开闭原则”

缺点:过多地使用适配器,会让系统非常零乱,不易整体进行把握
两种方式对象适配器(通过组合实现)和类适配器 (通过继承实现)
特点适配接口和被适配接口没有层次关系
java源码的体现

  • java.awt.event.MouseAdapter
  • java.io.InputStreamReader
  • java.io.OutputStreamWriter
代理模式

代理模式式定义:为 其他的对象提供代理以控制这个对象的访问
应用实例::spring中的AOP,媒婆,专人做 专事
优点

  • 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度
  • 可自由替换代理对象,符合“开闭原则”

缺点

  • 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢,
  • 有些代理模式的实现非常复杂

代理的类型

  • 远程代理为位于两个不同地址空间对象的访问提供了一种实现机制,可以将一些消耗资源较多的对象和操作移至性能更好的计算机上,提高系统的整体运行效率。
  • 虚拟代理通过一个消耗资源较少的对象来代表一个消耗资源较多的对象,可以在一定程度上节省系统的运行开销。
  • 缓冲代理为某一个操作的结果提供临时的缓存存储空间,以便在后续使用中能够共享这些结果,优化系统性能,缩短执行时间。
  • 保护代理可以控制对一个对象的访问权限,为不同用户提供不同级别的使用权限

java源码的体现

  • java.lang.reflect.Proxy
  • rmi
装饰者模式

装饰者模式定义:动态的给一个对象添加一些额外的职责,就增加功能 来说,装饰者相比子类更加灵活
应用实例:IO流,数据源
优点: 装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能
缺点:多层装饰比较复杂
关系装饰者和被装饰者接口有层次关系
java源码的体现

  • java.io.BufferedInputStream
  • java.io.DataInputStream
  • java.util.Collections#UnmodifiableList
桥接模式

桥接模式定义:将抽象与实现分离,使他们都可以独立变化
应用实例:手机品牌和手机 游戏,品牌中包含游戏,品 牌是抽象,游戏是具体的实 现
优点:抽象和实现的分离。优秀的扩展能力
缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程
java源码的体现java.sql.Connection#createStatement的不同数据库的抽象实现和java.sql.Statement不同数据库的具体实现

组合模式

组合模式定义:将对象组合成树形结构以表 示部分-整体的层次结构,组合模式使 得用户对单个对象和组合对象的使用具有一致性
应用实例:目录和文件,树型菜单
优点: 高层模块调用简单,节点自由增加。
缺点: 在增加新构件时很难对容器中的构件类型进行限制
关系组合对象和被组合对象可能是相同类型
java源码的体现

  • java.util.Map#putAll(Map)
  • java.util.List#addAll(Collection)
  • java.util.Set#addAll(Collection)
享元模式

享元模式定义:运行共享技术有效的支持大量细粒度的对象
应用实例::数据库的数据池,java中String的缓存
优点:大大减少对象的创建,降低系统的内存,使效率提高
缺点: 提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。
关系享元对象缓存共享实体
java源码的体现

  • java.lang.Integer#valueOf(int)
  • java.lang.Byte#valueOf(byte)
  • java.lang.ThreadLocal
外观模式

享元模式定义:为子系统中的一组接口提供一个一致的界面,外观模式定义了 一个高层接口,这个接口使得这些子系统更加容易使用
应用实例:java的三层模式
优点: 它实现了子系统与客户端之间的松耦合关系
缺点: 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。
关系门面接口和子系统接口自由组合实现
java源码的体现

  • org.springframework.web.servlet.DispatcherServlet
  • java.lang.Class

你可能感兴趣的:((2)结构型设计模式)