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

编程爱好者联盟 2016-09-20

本篇随笔主要介绍Java实现设配器设计模式。

先来看下待解决的问题:

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

(图片转自http://blog.csdn.net/jason0539)

由上图的情况可知,欧洲壁式插座只有三足插口,如果我们想要使用的是两足插口,就需要适配器来进行转换。(适配器一面是三足插口,一面是两足插口)

 适配器模式一般有两种实现方式: ;1、类适配器  2、对象适配器。

 先来看下类适配器的UML图:

 

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

; 客户端只能操纵 ;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);//利用转换器进行充电
     }
     
 
 }
; ; ; ;

运行结果:

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

可见两足插头也可进行充电。

2、对象适配器模式实现

UML图:

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

实现方式与类适配器实现方式大致相同,只不过将 ;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

相关推荐