设计模式--适配器模式,学习笔记
一般适配器模式类图如下:
图中Adapter与Adaptee的继承关系也可以换成关联关系(实心箭头)
1.解决的问题
将一个系统的接口转换成为另外一种形式,从而使原来不能直接调用的接口变得可以调用。
2.原理
主要由3部分组成:目标类、源类、和适配器类。
3.基本代码
1 /** 2 * 目标类 3 * */ 4 public interface Target { 5 void request(); 6 } 7 /** 8 * 9 * 源类 10 * 11 */ 12 public class Adaptee { 13 public void request(){ 14 System.out.println("method run!"); 15 } 16 } 17 /** 18 * 19 * 适配器类 20 * 21 */ 22 class Adapter implements Target { 23 24 private Adaptee adaptee; 25 26 public Adapter (Adaptee adaptee) { 27 this.adaptee = adaptee; 28 } 29 @Override 30 public void request() { 31 //经过接口维护,将adaptee重用 32 this.adaptee.request(); 33 System.out.println("method change!"); 34 } 35 }
1 public static void main(String[] args) { 2 AdapterGof adaptergof = new AdapterGof(); 3 Adaptee adaptee = adaptergof.new Adaptee(); 4 Target adapter =adaptergof.new Adapter(adaptee); 5 }
4.例子-得出疑问
已知一个实现类xxCircle实现了一个display()的方法。对这个类进行转换,可以让其他Shape类实现display()方法;
所以我们需要一个适配器Adapter,可以得出类图如下:
这道题是上设计模式课时老师课堂的一道练习题。正确答案或是如上图。思考看来,发现一个问题:
Adatper如何知道Target子类的信息呢?假设我需要产生一个Line对象,使用Adapter如何根据Line类来更改display()的方法实现呢??
得出如下类图:
每个适配器对应不同的子类,对目标类进行不同处理,得到不同的适配效果。
而查阅了该模式的优缺点如下:
1、由于适配器类是适配者类的子类,因此可以再适配器类中置换一些适配者的方法,使得适配器的灵活性更强。
2、把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和他的子类都适配到目标接口。
类适配器的缺点:
1、对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性,不能将一个适配者类和他的子类同时适配到目标接口。