【软件编程】Adapter适配器模式
-----------设计模式之 适配器模式---------------
1. 适配器模式属于接口模式,在JAVA中起始是比较多见的。
2. 适配器提供客户类需要的接口,适配器接口的实现是把客户类的请求转化为对适配者的相应接口的调用。换句话说:当客户类调用适配器的方法时,在适配器类的内部调用适配者类的方法,这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于借口不兼容而不能交互的类可以一起工作。
3. 在有些项目中,客户可能已经将一些基础的功能接口给我们了,而我们又不能修改它的源代码,只能利用他的接口。那么我们怎么样将客户的功能接口和我们拥有的代码结合起来,以适应于当前项目呢?我们可以这样做:使用Adapter,在这两种接口之间创建一个子接口,让这个子接口继承了客户的要求接口,并且子接口实现中,实现的我们自己扩展的代码行为。
举个例子:
主函数类:美国教练
球员类:美籍球员 训练方法:exercise ()
适配者类:中国球员训练方法:xunlian()
适配器:翻译员
外国教练用英语训练球员,方法为exercise (),但是中国球员听不懂,他只懂汉语的训练方法xunlian()。
我们又不能将中国球员类继承普通球员类。因为那样,中国球员类继承之后,必须重写exercise(),
然后方法体内调用自身的xunlian()方法,大大增加了代码修改量。而且如果此时再来一个韩国球员,日本球员,
那修改的代码将会更多。我们希望不要改动用户端和我们扩展端任何一方的代码。
那如果用一个适配器类:翻译员,继承球员类。重写exercise()方法。
实现体是调用相应中国xunlian()(日本)(韩国)的球员的各自方法。
再举个例子:
1.AdapterMain是一个显示器,它要得到Target图形发送器传过来的信号。
2.可我们只能接受CPU方的Adaptee数据发送器。
3.但是显示器只支持图形传过来,不支持0/1数据的发送。
4.需要Adapter将两个不兼容的接口,交互。
5.让Adapter继承了Target,因为显示器只认识Target。
6.然后Adapter类中重写了Target中的方法。方法体内实现的是:
7.Adaptee对象调用自己类中的特殊方法。
显卡:Adapter
Apater设计模式:“它是主机与显示器之间连接的“桥梁”,作用是控制电脑的图形输出,
负责将CPU送来的的影象数据处理成显示器认识的格式,再送到显示器形成图象。”
2 /*
3 * AdapterMain是一个显示器,它要得到Target图形发送器传过来的信号。
4 * 可我们只能接受CPU方的Adaptee数据发送器。
5 * 但是显示器只支持图形传过来,不支持0/1数据的发送。
6 * 需要Adapter将两个不兼容的接口,交互。
7 * 显卡:Adapter
8 * */
9 public class AdapterMain
10 {
11 public static void main(String[] args)
12 {
13 // CPU经过显卡的适配后“变”成了图形发送装置了
14 Target target = new Adapter(new Adaptee());
15 System.out.println(target.request());
16 }
17 }
18
19 //图形发送设备
20 class Target
21 {
22 /**
23 * 传送图形信号
24 */
25 public String request()
26 {
27 return "Graphic sender";
28 }
29 }
30 //CPU
31 class Adaptee
32 {
33 /**
34 * CPU输出的数据
35 */
36 public String getData()
37 {
38 return "CPU data";
39 }
40 }
41 //显卡,即我们的适配器
42 class Adapter extends Target
43 {
44
45 // 被代理的设备
46 private Adaptee apt = null;
47
48 /**
49 * 装入被代理的设备
50 */
51 public Adapter(Adaptee apt)
52 {
53 this.apt = apt;
54 }
55
56 /**
57 * 被代理的设备传过来的数据转换成为图形输出
58 */
59 public String request()
60 {
61 return apt.getData();
62 }
63 }
signature:
-------------------------------------------------------------------
向着理想进军!因为我是Vincent【象征着征服与执着】