设计模式举例-结构型

  • Post author:
  • Post category:其他




结构设计模式

行为设计模式处理的是动态的事务,结构设计模式处理的静态的结构。





Adapter(适配器模式)




:GUI框架当中,listener接口一般都会提供一个Adapter实现,接口实现者应该直接继承Adapter,而不是实现接口,好处是啥呢?因为很多时候,用户只关心部分事件,例如关心mouseClicked事件,如果直接实现接口会导致很多空方法产生,代码维护和美观度都不好,继承Adapter就可以解决这个问题。因为接口不兼容,需要使用Adapter来改变接口的示例还是少见的,在对接旧有系统的时候可能会用到。





Decorator(装饰模式)




:装饰模式可以实现动态的扩展对象的功能,典型的案例就是Java的io包,对IO功能实现动态的扩展,如下图:

例如,缓冲流BufferedInputStream可以实现对具体构件类的数据缓冲,如果不这样设计则具体构件类需要各自实现数据缓冲,不能实现代码最大重用,这些装饰具体实现类像零件一样可以自由的装备到具体构件类上面,动态实现装饰的功能。



Facade(外观模式)


:外观模式是一个在应用软件里面非常有用的设计模式,常常用在数据库访问层和网络访问层,下面举一个APP设计的例子。

使用Facde有下面几个好处:清晰分工,让网络层开发和GUI开发并行,网络FACADE对GUI层是透明的;隔离第三方类库的依赖,方便后面替换网络类库,如从HttpClient转换到OkHttp,隔离让GUI层和网络层的重用性大大提升;使用Mock网络实现方便自动化测试。

现在绝大多数APP项目没有使用Facade设计模式,开发者把第3方网络框架,如Volley,ImageLoader深深的嵌入到了GUI代码当中,更糟糕的是,一个项目可能会使用多个不同的网络框架,导致APP体积庞大,依赖关系混乱。





Proxy(代理模式):




代理模式一般软件里面比较少使用,但大型软件里面会常常出现,下面举一个大型连锁管理软件的使用案例,示意图如下:

代理模式为远程访问客户提供了和本地用户相同的体验,远程访问细节被屏蔽下来,真正的执行也是通过远程的”本地实现”来完成的。代理模式让”本地实现”不但可以用于本地数据库访问,也可以用于远程数据库的访问,扩展了”本地实现”的应用范围,实现了代码的重用。Java当中有个RMI机制也是使用了这种设计模式,实现了JAVA的跨虚拟机调用。



组合模式(Composite Pattern):


组合模式常常会和Visitor(访问者模式)一起使用,典型应用场景就是GUI框架的绘制过程,如:Swing的绘制机制。GUI界面都是大组件套小组件,是典型的”树”数据结构,这个结构正好和组合模式的结构一样。GUI绘制一般会有两个过程,一个是尺寸计算过程,一个是绘制过程,这两个过程都是树结构的层级递归调用。

组合模式的思想就是分而治之的思想,而且树状结构天然具有非常好的扩展性,如果不使用组合模式,GUI的绘制将很难实现。

下面是运用组合模式设计的一个条码设计模块,参考了Swing的绘制流程





Flyweight(享元模式)




:享元模式就是属性状态在N个对象之间的共享,这样可以大大节约内存,使用场景:WORD字处理软件中文字的状态,状态包含了字体信息,颜色信息等,这些信息都是可以在很多个文字共享的,每个文字只需要负责记录或者计算位置信息即可。另外一个例子就是EXCEL表格当中CELL的处理,CELL的状态信息是多个CELL可以共享的。





Bridge(桥接模式)




:A和B两个模块使用抽象类引用建立起连接,这个连接就是桥,A和B都是独立的类继承架构体系,两者可以实现独立的演化,耦合只存在于上面的抽象类,下面的具体实现类不产生耦合。桥接模式是一个广泛使用的设计模式,应用场景也非常多,下面使用一个大型DRP系统的单据保存来做举例说明。

单据GUI的基类实现了单据的CRUD,审核和反审等操作,各个单据个性化的流程通过模板方法模式实现,单据的数据库操作,通用操作放在基类处理,个性化流程放到下面的子类当中,也是使用了模板方法模式,GUI和单据实体类都实现了独立的演化。



版权声明:本文为huangyuncong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。