设计模式,其实是一种解决方法。
Java 是一种面向对象的语言,对于所有的设计模式的实现上,总少不了接口、抽象类的参与。
同时,接口和抽象类的存在就是要被实现的,而在设计模式中,总是少不了对接口的实现和对抽象类的继承。
所以有的时候就会发现,设计模式似乎是为了去实现接口而去写接口。
对于这三种设计模式,都定义了接口这些东西,所以才有了现在的混淆。
三种设计模式的概念
-
适配器模式:一个适配器允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法就是将类自己的接口包裹在一个已存在的类中。
-
装饰器模式:原有的类不能满足现在的需求,要对原有的类进行增强。
-
代理模式:同一个类去调用另一个类的方法,不对这个方法进行直接操作。
适配器模式
适配器的特点在于兼容,从代码的特点上来说,适配器与原有的类具有相同的接口,并且持有新的目标对象。
具体并简单点说,就是要将原接口转换为客户端希望的另一个接口,这就是适配器模式。(适配客户端的需求)
而这种转化无非就两种方式:
- 继承原类或者实现原接口
- 持有原接口的对象
然后再实现目标接口。
第一种就是类的适配;第二种就是对象的适配。
就如同一个三孔转两孔的适配器一样:
它有三孔的插头,可以插到三孔插座里;
同时它又有两孔的插座,可以被两孔的插头插入。
其本质是在于对原有的三孔插座的改造。
使用适配器模式的时候,我们必须同时持有原对象、适配对象、目标对象。
代理模式
特点在于隔离,隔离调用类和被调用类,通过一个代理去调用。
代理模式和适配器模式的最大的区别,就是代理模式是与原对象实现同一个接口;而适配器类则是匹配新接口,说白了,就是实现一个新的接口。
装饰器模式
其特点在于增强,被装饰的类和所有的装饰类必须实现同一个接口,而且必须持有被装饰的对象。被装饰类可以被无限装饰。
也就是说,在装饰器模式中,必须要有被装饰的类和用来装饰的类。在用来装饰的类中,可以把被装饰的类当做参数传入。
装饰模式和代理模式的区别之处在于,代理模式一定是自身持有这个对象,不需要从外部传入;而装饰模式的一定是需要从外部传入的,并且可以没有顺序,可以按照代码的实际需求随意调换顺序。
小总结
从使用是看,代理模式注重的是隔离限制,让外部不能访问你实际的调用对象,比如权限控制;而装饰模式注重的是功能拓展,在同一个方法下实更多的功能。
- 适配器模式是将一个类(a)通过某种方式转换成另一个类(b).
- 装饰模式是在一个原有类(a)的基础之上增加了某些新的功能变成另一个类(b).
- 代理模式是将一个类(a)转换成具体的操作类(b).
具体实例请参考文章开头的链接。