首页 > 代码库 > 适配器设计模式初探(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实现)