适配器模式,包括3种,针对类的适配器、针对对象的适配器、针对接口的适配器,其中针对对象的适配器是关键因为它可以理解为其他结构性模式的基础。下面分别进行说明
类的适配器
要点:3个主要元素,source类(待适配)、adapter、目标接口 Targetable ,adapter继承source,实现Targetable。
对象的适配器
要点:3个主要元素,source类(待适配)、adapter、目标接口 Targetable,adapter实现Targetable,包含一个source的实例。
接口的适配器
要点:一个已经存在的interface,我只需要用到该interface当中的部分方法,这个时候可以写一个abstract类,实现interface的所有方法,然后用我的类去继承该abstract类,实现我需要用的方法即可。
难易程度:比较简单
广泛程度:比较广泛
装饰者模式
要点:一个interface,一个Source类,一个 Decorator 类, 都实现这个接口,在Decorator 的构造函数当中传入一个Source的实例,在他们的同名方法当中,Decorator 的实现会比Source的实现多了一些操作。
难易程度:比较简单
广泛程度:一般
代理模式
要点:一个interface,一个Source类,一个 Proxy类, 都实现这个接口,在Proxy的构造函数当中new一个Source的实例,在他们的同名方法当中,Proxy的实现会比Source的实现多了一些操作。
难易程度:比较简单
广泛程度:比较广泛
在这里,我们可以比较一下装饰者模式和代理模式,其实他们是很像的,区别只是,对于client而言,我知道Decorator修饰的是哪个类,而不知道Proxy代理的究竟是谁。
而装饰者模式和对象的适配器模式也很像,区别只是source和adapter不实现同一接口,而source和Decorator 实现同一接口。
所以,从语义上来讲,适配器,是为了让原本不合用的东西,能够为我们现行系统所用,而装饰者只是为了增强某些现有方法的功能。
外观模式
要点:用一个Facade类,把若干个类组合在一起。
典型场景:其实这样的做法,即使你完全不了解设计模式,还是会经常用到的。
难易程度:很简单
广泛程度:非常广泛
桥接模式
要点:把抽象的概念和具体的行为分离开来。
典型场景:如果我们需要对一个概念进行多维的划分,如果采用继承的方式,可能会出现多层的继承关系, 而把抽象的概念和具体的行为分离开来,会极大的简化我们的代码。
难易程度:理解起来较为困难
广泛程度:比较广泛
组合模式
要点:二叉树、链表等
典型场景:二叉树、链表
难易程度:具体的应用比较困难
广泛程度:非常广泛
享元模式
要点:多与工厂模式一起使用,在需要使用一个类对象的时候,并不是直接创建,而是从共享池当中查找有没有可用的,如果没有,创建,如果有,直接拿过来用
典型场景:连接池
难易程度:实现较困难
广泛程度:比较广泛