你的位置:首页 > Java教程

[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