[设计模式]适配器模式

先举个例子说明适配器模式:

A会说英语,B会说汉语,他们彼此无法和对方交流,现在C说,我充当你们的翻译。

如果把A看做是接口,B也是接口,那么C就是一个适配器,如果它能够把A的语言转化成B想要的语言,或者把B的语言转化成A想要的语言,那么它就是单向适配器,如果它能够把他们的语言互转,那么它就是双向适配器。

下面来看下UML图:

image

程序员得看代码才有感觉。下面上代码:

场景:一个中国人,经常生活在中国,有一天,他出国了,带着相机去美国度假去了,准备拍些照片回来,结果悲剧了,玩到一半相机没电了,但是中国的插销没有办法插进美国的插座!!!,这时候,他得去买一个转换器(在程序中就叫做适配器)了。

咱们先写一个中国式的插座标准:

package com.design.adapter;
public interface ChinaSocket {
  public void ChinaSocketInfo();
}

再来一个实现:

package com.design.adapter;
public class ChinaSocketInstance implements ChinaSocket {
  public void ChinaSocketInfo() {
    System.out.println("您正在使用中国插座!");    
  }
}

接下来写一个美国插座的标准:

package com.design.adapter;
public interface AmericaSocker {
  public void AmericaSockerInfo();
}

再来一个实现:

package com.design.adapter;
public class AmericaSockerInstance implements AmericaSocker {
  public void AmericaSockerInfo() {
    System.out.println("您正在使用霉国插座");
  }
}

现在两种插座都有了,但是就是不能用.不急,咱们自己弄一个转换器.

package com.design.adapter;
public class ChinaSocketAdapter implements ChinaSocket {
  //这个地方只所以使用接口,可以在使用的时候动态地指定实现类,实现运行时多态。
  private AmericaSocker americaSocker;
  public void ChinaSocketInfo() {
    americaSocker.AmericaSockerInfo();
  }
  //构造函数
  public ChinaSocketAdapter(AmericaSocker americaSocker) {
    this.americaSocker = americaSocker;
  }
}

 

下面咱们测试一下能不能使用美国的插座给相机充电.

package com.design.adapter;
public class TestSockerAdapter {
  /**
   * 在这里,咱们就把霉国的插座变成了中国的插座,厉害吧!
   * 这就是传说中的适配器模式,很简单吧!
   */
  public static void main(String[] args) {
    System.out.println("开始使用美国-->中国的电源转换器!");
    AmericaSocker americaSocker=new AmericaSockerInstance();
    ChinaSocketAdapter chinaSocketAdapter=new ChinaSocketAdapter(americaSocker);
    chinaSocketAdapter.ChinaSocketInfo();
  }
}

最后来看下结果,看到底充成电了没有.

开始使用美国-->中国的电源转换器!
您正在使用霉国插座

好了,大功告成!收功~!今天下午继续去拍照去!

posted @ 2012-03-14 20:23  yanglover  阅读(292)  评论(0编辑  收藏  举报