Java设计模式-接口型模式

in 四月桐花 with 0 comment

导语

接口型设计模式始终是从业务需求的角度考虑分类的,总得来说,当你拿到确定的需求时,首要考虑的是如何设计好你的输入|输出,这无论是对于系统梳理,还是程序员之间的代码交互都是有益的,即便是抽象度较高的桥接模式,在Client层,依旧是为了降低其调用和操作上的复杂度.
接口型设计模式是为了优化接口背后的实现,降低代码的维护难度,无论在结构上简单还是复杂,它们的作用和效果都是明显的.

适配器模式-Adapter

通常我们在系统设计的时候,会根据高内聚的原则,会优先定义出一些核心类(CoreClasses),这些类出现的目的并不会直接提供给Client直接使用,而是为了给系统做最底层的业务支撑.
我们当然可以直接通过这些核心类为Client提供服务,但这么做会产生两个严重的问题:一是为Client提供服务的Service类(或Client类自身)的代码非常的庞大;另一个是对于相似的功能,其内部会产生大量相似甚至一模一样的代码段.
此时我们可以使用Adapter模式优化我们的代码系统,需要强调的是如果你试图通过扩展你的核心业务类的功能来减少Client的复杂度将会与设计思想背道而驰,这样做你将会得到一批极其庞大,且与业务深度耦合的核心类.
Adapter有两个重要的特征:

  1. Adapter是直接面向Client原始需求的,在使用Adapter的时候,首要关注的是如何给Client提供一个直接易懂的接口
  2. Adapter通过继承(不建议)或持有(建议)核心类的方式,将原始需求的实现封装在Adapter自身
    P.S.当然你也可以做出更多的优化,比如将Adapter的抽象与实现进行分离,以确保其在开闭原则下,必要的功能得到了实现,但这些都是扩充的部分.

外观模式-Facade

外观模式是一个系统与子系统关系层面的设计概念,侧重点在于统一了操作对象,对于Client而言,使用Facade模式意味着Client不必关注业务功能具体需要调用哪个类,想要实现Client期望的功能,只需要始终面对一个类的对象即可.
Facade模式具有一些特征:

  1. Facade通常会持有若干个子系统的类(ChildSystems),这些子系统的类所提供的功能是完善独立的.
  2. 相较于Adapter的封装,Facade一般不会持有核心业务类(CoreClasses),也不会在其提供的方法中作过多的业务逻辑实现.

组合模式-Composite

组合(合成)模式所适用的场景十分的明显,当你发现接下来的程序设计中满足下面两个特点,就可以首先考虑Composite模式了:

  1. 需要设计的对象存在对自身递归调用的要求时,这种特征经常出现在算法设计,数据挖掘这样的业务类型中
  2. 在递归调用特征的前提下,需要对外部暴露统一操作接口时,例如文件系统中"文件夹-文件"的操作
    P.S.Composite模式从结构上看,是有可能出现"环"结构的,这种情况需要根据具体的业务要求做处理,但其目的都是为了保证递归行为能够遍历到所有节点不会形成死循环.

桥接模式-Bridge

Bridge是抽象编程的范例,所谓抽象部分与实现县部分分离,具体的讲,桥接模式至少涉及两个抽象类:

结语

设计模式本身的区别并没有那么明显,例如策略模式和状态模式这种,另外在系统设计的过程中,"模式"通常是混合出现的,所以才会有人提出了一些设计原则设计思想,目的是为了打破工程师对设计模式的定式思维.当然,至少你要对Base的部分有相对充分的理解才行.

附录

设计模式.jpeg