(第二大类)结构型模式 小小总结一下

来源:互联网 发布:2333软件登录不了 编辑:程序博客网 时间:2024/05/29 07:47

From Now On,Let us begin Design Patterns。

结构型模式可以让代码结构更加清晰明了,程序更易于维护,同时符合OCP,程序更加易于扩展。

目标

结构型模式可以让代码结构更加清晰明了,程序更易于维护,同时符合OCP,程序更加易于扩展。降低对象之间的耦合性。结构型模式有7种,分别是:

  • 代理模式
    目标: 体现功能复用
    相识区别: 适配器模式:对于适配器模式当中的定制适配器,它与静态代理有着相似的部分,二者都有复用功能的作用,不同的是,静态代理会修改一部分原有的功能,而适配器往往是全部复用,而且在复用的同时,适配器还会将复用的类适配一个接口
    优点: 职责清晰:真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是编程简洁;高扩展性:具体主题角色是随时都会发生变化的,只要它实现了接口,不用管它如何变化,都逃不了接口,那我们的代理类完全可以在不做任何修改的情况下使用。
    缺点: 切入点的不稳定,涉及到业务逻辑
    使用场景: 需要修改或屏蔽某一个或若干个类的部分功能,复用另外一部分功能,可使用静态代理,若是需要拦截一批类中的某些方法,在方法的前后插入一些一致的操作,假设这些类有一致的接口,可使用JDK的动态代理

  • 适配器模式
    目标: 遵循开闭原则,体现功能复用
    相识区别: 装饰器模式:对于适配器模式中的定制适配器与装饰器模式,二者都是使用组合加继承的手段,不同的是,适配器模式的目的在于适配接口,职能不变,生成的目标对象类型不再是原对象,装饰器模式的目的在于动态的添加功能,且可以叠加,生成的目标对象类型是原对象。
    优点: 提高了类的复用性,源角色在新旧两个系统都可以使用;灵活性好,若某天不需要了,拆掉适配器即可;将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码
    缺点: 对于对象适配器来说,更换适配器的实现过程比较复杂
    使用场景: 需要修改一个已经投产中的接口时,适配器模式可能是最适合的模式。比如:系统扩展了,需要使用一个已有或新建立的类,但这个类又不符合系统的接口。

  • 装饰模式
    目标: 遵循迪米特、单一职责、开闭原则,体现功能复用,但是破坏里氏替换
    相识区别:
    优点: 装饰类与被装饰类可以独立发展,而不会相互耦合;装饰模式是继承关系的一个替代方案;装饰模式可以动态地扩展一个实现类的功能
    缺点: 尽量减少装饰叠加类的数量,叠加次数越多,系统的复度越高;利用装饰者模式,会造成设计中存在大量的小类,代码不易读
    使用场景: 一个类需要动态的添加功能,且这些功能可以相互叠加;当业务变更,冒出新需求时,尤其是一个较大的需求时,可以考虑它;需要为一批兄弟类进行改装或加装功能,首选装饰模式

  • 桥接模式 :
    目标: 遵循迪米特、单一职责、开闭原则,体现功能复用,但是破坏里氏替换
    相识区别: 桥接模式代码结构体有点像装饰模式:但是桥接模式注重的是一个对象多角度的独立变化,装饰模式强调的是一个对象多次包装;桥接模式主要的目的在于用组合而不用继承实现多角度变化的降维处理,返回不同的对象,装饰模式返回同一个对象。
    优点: 对复杂的层次结构进行了降维,用聚合替代了继承的关系,代码更加容易维护;抽象与实现分离:实现不用再绑定在一个固定的抽象层次上;
    缺点: 有一定难度,需要好好理解,需要一定的经验才可以熟练使
    使用场景: 一个对象有多个维度的变化,需要将这些维度抽离出来,让其独立变化

  • 门面模式 :
    目标: 遵循迪米特法则/最少知识原则
    相识区别: 中介者模式:二者都是为了处理复杂的耦合关系,不同的是门面模式处理的是类之间复杂的依赖关系,中介者模式处理的是对象之间复杂的交互关系。
    优点: 减少系统的相互依赖:把外界对子系统的依赖转为对门面的依赖,与子系统无关;松散耦合:门面模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护;简单易用:门面模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了;门面模式提高了安全性:外界只能访问到门面上开通的方法,而不能触及子系统的其它业务;更好的划分访问层次
    缺点: 不符合开闭原则,一旦在系统投产后发现错误,就只能修改门面角色的代码,风险大需考虑,门面类很容易就成了万能类
    使用场景: 为一个复杂的模块或子系统提供一个供外界访问的接口;预防低水平人员开带来的风险扩散(为其限定某一子系统,供其开发)

  • 组合模式 :
    目标: 遵循依赖倒置、开闭原则,破坏接口隔离
    相识区别: 中介者模式:二者都是为了处理复杂的耦合关系,不同的是门面模式处理的是类之间复杂的依赖关系,中介者模式处理的是对象之间复杂的交互关系。
    优点: 高层模块调用简单;更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。这一点符合开闭原则的要求,对系统的二次开发和功能扩展很有利,我们需要的构件可以直接在叶子节点加入;节点自由增加:容易扩展,符合OCP,对维护有利
    缺点: 组合模式不容易限制组合中的构件,叶子节点可能会实现其他的方法;叶子节点的数量可能会很多
    使用场景: 当有一个结构可以组合成树形结构,且需要向客户端提供一致的操作接口,使得客户端操作忽略简单元素与复杂元素;将对象组合成树形结构以表示“整合-部分”的层次结构,从而使得用户对单个对象和组合对象的使用具有一致性,也就是客户端能够透明地无区别地操作两者。组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以向处理简单元素一样来处理复杂元素。

  • 享元模式 :
    目标: 遵循依赖倒置、开闭原则,破坏接口隔离
    相识区别:
    优点: 大大减少应用程序创建的对象,降低程序内存的占用,增强程序的性能;外部状态相对独立,不影响内部变化
    缺点: 提高了系统的复杂性:需要分离出外部状态和内部状态;为了节省内存,共享了内部状态,分离出了外部状态,而读取外部状态使运行时间变长。用时间换空间
    使用场景: 一些状态相同的对象被大量的重复使用。

结构型模式的意义

类高内聚,类与类之间低耦合

通过继承和对象组合实现结构型模式,其中继承实现的是类结构型模式,对象组合实现的是对象结构型模式。注意优先使用对象组合,而不是类继承。

原创粉丝点击