适配器设计模式初探(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 ;方法。
接下来看具体的代码实现:
interface Target { void Request();//规定两足插头充电标准,必须插入两足插座 } class Adaptee { public void SpecificRequest() { System.out.println("把三足插头插在我身上可以进行充电"); } } class Adapter extends Adaptee implements Target { @Override public void Request() { // TODO Auto-generated method stub //先调用父类的SpecificRequest方法,相当于把转换器的一头插在欧洲的三足插座上, //另一头就可以给两足插头进行充电了 super.SpecificRequest(); System.out.println("把两足插头插在我身上可以进行充电"); } } public class Client { public static void charge(Target target) { //客户调用 Request 方法进行充电 target.Request(); } public static void main(String[] args) { Adapter ad = new Adapter();//在欧洲先买一个转换器 charge(ad);//利用转换器进行充电 } }; ; ; ;
运行结果:
可见两足插头也可进行充电。
2、对象适配器模式实现
UML图:
实现方式与类适配器实现方式大致相同,只不过将 ;Adapter ;从 ;Adaptee ;类继承 ;改为 ; Adapter ;持有 ;Adaptee ;类对象。
interface Target { void Request();//规定两足插头充电标准,必须插入两足插座 } class Adaptee { public void SpecificRequest() { System.out.println("把三足插头插在我身上可以进行充电"); } } class Adapter implements Target { private Adaptee adaptee; public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void Request() { // TODO Auto-generated method stub adaptee.SpecificRequest(); System.out.println("把两足插头插在我身上可以进行充电"); } } public class Client { public static void charge(Target target) { //客户调用 Request 方法进行充电 target.Request(); } public static void main(String[] args) { Adapter ad = new Adapter(new Adaptee());//在欧洲先买一个转换器并将其一端插入三足插座 charge(ad);//利用转换器进行充电 } }; ;
运行结果同上。
适配器设计模式一般用于系统后期扩展、修改。
参考文章:http://blog.csdn.net/ymeng_bupt/article/details/6833480
http://blog.csdn.net/jason0539/article/details/22468457