适配器设计模式初探(Java实现)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了适配器设计模式初探(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     @Override
14     public void Request() {
15         // TODO Auto-generated method stub
16         
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     @Override
20     public void Request() {
21         // TODO Auto-generated method stub
22         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实现)的主要内容,如果未能解决你的问题,请参考以下文章

JAVA设计模式初探之适配器模式

设计模式6.1-- 初探适配器模式

Java学习笔记之十三初探Java面向对象的过程及代码实现

装饰器设计模式初探(Java实现)

Java 网络编程初探

初探JSP与LEeclipse