结构型模式

前言

  上次我们了解了创建型模式,今天我们来一起学习一下结构型模式。

内容

 外观模式

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

  实例:股票OR基金
  结构型模式
  优点:降低了耦合性,体现了依赖倒转和迪米特法则
  适用场景:设计初期,提供一个接口,降低耦合性;开发阶段,提供接口,减少依赖;维护:提供接口,新系统与接口对象交互,接口对象与遗留代码交互;

 适配器模式

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

  实例:姚明在NBA
  结构型模式
  优点:灵活性,扩展性好,开放封闭的原则;

  适用场景:需要的东西就在面前,但却不能使用,而短时间又无法改造;系统的数据和行为都正确,但接口不符;

 代理模式

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

  实例:代替告白,求婚
  结构型模式
  优点:远程代理,为一个对象在不同的地址空间提高局部代表(解决远程访问的问题);虚拟代理,存放实例化需要很长时间的真实对象(打开HTML网页);安全代理( 对象具有不同的访问权限);智能指引,指当调用真实对象时,代理处理另外一些事;

 装饰模式

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

  实例:约会穿衣服
  结构型模式
  优点:把类中的装饰功能从类中搬离去除,简化原有的类;把类的核心职责和装饰功能区分开;可以去除相关类中重复的装饰逻辑;

  缺点:产生很多小对象,占用系统资源;比继承更容易出错;

  适用场景:(1) 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责;
       (2) 当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式;

 桥接模式

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

  实例:手机软件的不统一
  结构型模式
  优点:多角度分离出来独立变化,减少他们之间的耦合;可以取代多层继承,减少子类的个数;符合开放封闭原则,任意扩展一个维度,不需要修改原有系统;

  缺点:增加理解和设计难度;能抽象出来独立变化的维度;

  适用场景:需要多角度去分类实现对象,而使用继承会造成大量的类的增加的情况下;

 组合模式

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

  实例:分公司项目
  结构型模式
  优点:方便控制整个层次结构;一次使用整个结构或单个对象;符合开放封闭原则;

  缺点:难以对构件类型进行限制;

  适用场景:需求体现的是部分与整体的层次结构,希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时;

 享元模式

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

  实例:项目多也被傻做
  结构型模式
  优点:实例总数减少,存储节约越多;

  缺点:需要维护一个记录了系统已有的所有享元的列表,需要消耗资源;使得系统更复杂;

  适用场景:一个应用程序使用了大量的对象造成了很大的存储开销;相对较少的共享对象取代很多组对象;

总结

  结构型模式关注的是对象的组成以及对象之间的依赖关系,因为如何设计对象的结构,继承和依赖关系会影响到后续程序的维护性,代码的健壮性。同时,结构型模式也包容了对问题的解决,外观,代理,装饰,组合易于扩展;适配器和桥接易于封装。