在日常工作过程中会涉及到很多设计模式的使用,常用的有23种模式,但是其中比较常用的模式倒是没多少,今天主要介绍下适配器模式、装饰模式、代理模式,很多人刚开始学习这3种模式的时候都很容易疑惑,这3种模式有什么区别,感觉用起来都差不多,我在面试的时候也会常问面试人员这3种模式的差异,下面我就介绍下这3种模式,并且说明下这3种模式的差异和不同的适用场景。
1.适配器模式
适配器模式是我们日常比较常用的模式之一,适配器模式的主要使用场景为当系统已经有一套成熟稳定的对外或者内部接口,但是外部系统又有雷同功能的需求,这里就涉及到在不改变原接口的情况下又要对外提供有差异的接口,这里就可以使用到适配器模式,在原有接口外面再包装一层适配器接口来满足目标系统使用。适配器模式有好几种使用模式,常用的有适配器类通过继承原功能类来实现原功能,再包装成适配目标接口;还可以通过在适配器类中引用原功能类来复用原功能,再包装成目标适配接口。类图如下:
2.装饰器模式
装饰器模式的咋看起来和适配器模式很像,但是适配器模式的核心思想是保证接口不变的情况下,增加原接口的功能,起到装饰的功能。类图如下:
3.代理模式
代理模式是一种很常用的设计模式,其目的是对其他对象提供一种代理以控制对这个对象的访问。
代理模式又分为静态代理和动态代理,静态代理是在程序运行之前就已经存在了代理类,动态代理是程序运行中在内存中生成代理类。
代理模式存在的意义:代理模式是为了解决滥用继承的问题而生的,当想对某个类的功能进行扩充的时候可以使用继承或聚合,很明显用继承的话会造成类泛滥。代理类的类图如下:
4.适配器模式VS装饰器模式VS代理模式
适配器模式VS装饰器模式
装饰者与适配者模式的区别 1.关于新职责:适配器也可以在转换时增加新的职责,但主要目的不在此。装饰者模式主要是给被装饰者增加新职责的。
2.关于原接口:适配器模式是用新接口来调用原接口,原接口对新系统是不可见或者说不可用的。装饰者模式原封不动的使用原接口,系统对装饰的对象也通过原接口来完成使用。(增加新接口的装饰者模式可以认为是其变种--“半透明”装饰者)
3.关于其包裹的对象:适配器是知道被适配者的详细情况的(就是那个类或那个接口)。装饰者只知道其接口是什么,至于其具体类型(是基类还是其他派生类)只有在运行期间才知道
装饰器模式VS代理模式
在装饰器模式和代理模式之间还是有很多差别的。 装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。 因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。
总结下来三种模式的主要区别为以下3点:
1 适配器模式是将一个类(a)通过某种方式转换成另一个类(b). 2 装饰模式是在一个原有类(a)的基础之上增加了某些新的功能变成另一个类(b). 3 代理模式是将一个类(a)转换成具体的操作类(b)