结构型设计模式对比
适配器模式
适配器模式要解决的问题是:让两个没有任何关系的类在一起运行,如下图:
类A和类B无法直接在一起使用,这个时候就需要用适配器模式,引入一个适配器来解决问题。
桥接模式
桥接模式需要解决的问题是,一种需要二维属性去描述的对象会产生大量的类,且不易于扩展如下:
在图中是要绘制图形形状以及添加颜色,如果要增加一个新的颜色需要在每个图形下添加3个类,如果增加一个新的图形需要增加4个类(形状、以及颜色)。
如果用桥接模式表示:
这种模式下更加易于扩展,也简化了系统中类的数量。
装饰器模式
装饰器模式是为了解决一个类本身功能可能不足以满足一个新的场景,可以使用装饰器灵活的添加功能,对一个对象可以增加多个装饰器。 例如一个人穿的衣服,在出席一些比较重要的场合可以穿的衣服都是不一样的,比如平时在家穿的宽松舒适的衣服、出席重要场合可以穿西装、打领带等。
图中绿色的代表装饰器,黄色代表人
如果在家那么使用装饰器就可以如下图:
如果出席重要场合:
外观模式(门面模式)
外观模式是提供一个门面来让第三方直接访问门面类而无需直接访问系统内部类,由门面类来处理系统内部类的调用。 例如:程序员想要购买一台电脑,如果自己组装那就需要自己在网上查找购买各个组件主板、CPU、显示器等等。
如果使用门面模式,这个时候有一个统一的入口提供了各种组件的销售,那么程序员就不用一个一个店铺去找想要的组件了。
代理模式
代理模式是为了对被代理对象的功能进行增强,使用一个代理对象去控制目标对象。
例如:大学生想要买一台电脑,但是什么都不懂,这个时候可能就会买到一些二手的、低配置的电脑。如下:
通过找一个代理,就可以实现这样:
装饰器模式是对目标对象本身的增强,可以多层装饰在目标对象功能上,而且可以随意组合装饰器
代理模式是提供一个代理对象来控制目标对象,是在代理对象内部做的对目标对象的增强,让代理对象去做一些功能的增强。
组合模式
组合模式是将对象组合成树形结构以表示部分-整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
例如公司员工层级:
使用组合模式是内部结构划分为叶子节点、以及拥有下属的分支节点。
使用这种结构就可以表示出属性结构中的所有节点。使用场景树形结构的对象,如文件目录、商品分类等。
享元模式
享元模式主要是为了解决系统内存在大量相似对象,增加了系统的内存占用的问题,享元模式通过使用共享技术有效的支持大量细粒度的对象,降低系统内对象的内存占用。
例如:每个用户都需要查看火车票信息,可能会出现这样的情况:
火车票信息对象可能针对用户生成了多个对象。使用享元模式表现形式如下: