首页 > 代码库 > 适配器设计模式初探(Java实现)
适配器设计模式初探(Java实现)
本篇随笔主要介绍Java实现设配器设计模式。
先来看下待解决的问题:
(图片转自http://blog.csdn.net/jason0539)
由上图的情况可知,欧洲壁式插座只有三足插口,如果我们想要使用的是两足插口,就需要适配器来进行转换。(适配器一面是三足插口,一面是两足插口)
适配器模式一般有两种实现方式: 1、类适配器 2、对象适配器。
先来看下类适配器的UML图:
客户端只能操纵 Target 接口的 Request 方法来进行需要的操作(当然这里就相当于调用 Request 方法使用 两足插口 进行充电)。而接口具体的实现类有两种,一种是调用 ConcreteTarget 的 Request 方法进行充电(在例子中相当于直接把 两足插口 插入到 两足插座 上,遗憾的是我们现在在欧洲,而欧洲是没有 两足插座 的,只有 三足插座 ,所以 ConcreteTarget 的Request方法我们是不能使用的)。还有一种是调用 Adaptee类 的 SpecificRequest 方法进行充电(这相当于使用 三足插座 进行充电,可是我们现在只有 两足插口 ,是不能将其插入到 三足插座 中进行充电的,换句话说,Adaptee 类的 SpecificRequest 方法我们无法直接调用),这时我们就需要用到 适配器类 Adapter 来将 Adaptee 类的 SpecificRequest 方法转化为我们可以调用的 Request 方法。
接下来看具体的代码实现:
1 interface Target { 2 void Request();//规定两足插头充电标准,必须插入两足插座 3 } 4 5 class Adaptee { 6 public void SpecificRequest() { 7 System.out.println("把三足插头插在我身上可以进行充电"); 8 } 9 }10 11 class Adapter extends Adaptee implements Target {12 13 @Override14 public void Request() {15 // TODO Auto-generated method stub16 17 //先调用父类的SpecificRequest方法,相当于把转换器的一头插在欧洲的三足插座上,18 //另一头就可以给两足插头进行充电了19 super.SpecificRequest();20 21 System.out.println("把两足插头插在我身上可以进行充电");22 }23 24 }25 public class Client {26 27 public static void charge(Target target) {28 //客户调用 Request 方法进行充电29 target.Request();30 }31 32 public static void main(String[] args) {33 Adapter ad = new Adapter();//在欧洲先买一个转换器34 charge(ad);//利用转换器进行充电35 }36 37 38 }
运行结果:
可见两足插头也可进行充电。
2、对象适配器模式实现
UML图:
实现方式与类适配器实现方式大致相同,只不过将 Adapter 从 Adaptee 类继承 改为 Adapter 持有 Adaptee 类对象。
1 interface Target { 2 void Request();//规定两足插头充电标准,必须插入两足插座 3 } 4 5 class Adaptee { 6 public void SpecificRequest() { 7 System.out.println("把三足插头插在我身上可以进行充电"); 8 } 9 }10 11 class Adapter implements Target {12 13 private Adaptee adaptee;14 15 public Adapter(Adaptee adaptee) {16 this.adaptee = adaptee;17 }18 19 @Override20 public void Request() {21 // TODO Auto-generated method stub22 adaptee.SpecificRequest();23 24 System.out.println("把两足插头插在我身上可以进行充电");25 }26 27 }28 public class Client {29 30 public static void charge(Target target) {31 //客户调用 Request 方法进行充电32 target.Request();33 }34 35 public static void main(String[] args) {36 Adapter ad = new Adapter(new Adaptee());//在欧洲先买一个转换器并将其一端插入三足插座37 charge(ad);//利用转换器进行充电38 }39 40 41 }
运行结果同上。
适配器设计模式一般用于系统后期扩展、修改。
参考文章:http://blog.csdn.net/ymeng_bupt/article/details/6833480
http://blog.csdn.net/jason0539/article/details/22468457
适配器设计模式初探(Java实现)