從應(yīng)用的角度來(lái)看,適配器模式在代碼中應(yīng)用的機(jī)會(huì)并不多。但從生活角度看,非常直觀生動(dòng),容易理解。去過(guò)美國(guó)的朋友都知道在去之前需要準(zhǔn)備一個(gè)電源的轉(zhuǎn)換器,因?yàn)槊绹?guó)的插座格式和中國(guó)的不同,需要在中間做一個(gè)轉(zhuǎn)換,這是一個(gè)非常經(jīng)典的適配器模式的例子。適配器模式就是把不適應(yīng)的接口變成適應(yīng)(或者叫做期望)的接口。
我原來(lái)有一個(gè)同事,名字叫做Garin,從小就會(huì)洗衣服,但是不會(huì)做飯;第一次找了個(gè)女朋友,結(jié)果人家女孩要求基本條件就是會(huì)洗衣做飯。
1 public interface IIdealBoyFriend {
2 public void doCooking();
3 public void doWashing();
4 }
5
一看不對(duì)呀,接口不匹配,怎么辦,簡(jiǎn)單,適配吧:
1 public class BoyCanWashClothes {
2
3 private String name = null;
4
5 public void doWashing(){
6 System.out.println(name +" 費(fèi)了九牛二虎之力總算洗完了衣服,好累啊。");
7 }
8
9 public BoyCanWashClothes(String name) {
10 super();
11 this.name = name;
12 }
13
14 }
只會(huì)做飯,不會(huì)洗衣服;適配以后:
1 public class PuteBoy extends BoyCanWashClothes implements IIdealBoyFriend{
2
3 public PuteBoy(String name) {
4 super(name);
5 }
6
7 @Override
8 public void doCooking() {
9 System.out.println(name+"找了個(gè)菜譜,倒騰了半天,終于把飯做熟了。");
10 }
11
12 }
妥了,學(xué)會(huì)做飯了。細(xì)心的同學(xué)可能發(fā)現(xiàn),上面的例子其實(shí)是類的適配器模式,不但Garin能適配,Tom也能,James也可以。話說(shuō)Garin用適配器模式搖身一變,會(huì)做飯了,但是由于缺乏修煉(還要花大量時(shí)間洗女朋友的臟衣服),飯菜味道不地道,女朋友和他吹了。又過(guò)了一段時(shí)間,Garin又找了個(gè)新的女朋友,還是得會(huì)洗衣做飯,而且規(guī)定衣服不能機(jī)洗,只能手洗。這回Garin該怎么辦呢,答案還是適配器模式,但是方法要變一變:
1 public class SmartBoy implements IIdealBoyFriend {
2
3 private String name = null;
4
5 public SmartBoy(String name) {
6 super();
7 this.name = name;
8 }
9
10 public void callHelp(BoyCanWashClothes worker){
11 this.worker = worker;
12 }
13
14 private BoyCanWashClothes worker = null;
15
16 @Override
17 public void doCooking() {
18 System.out.println(name+" 聚精會(huì)神做菜,滿滿的都是愛(ài),飯菜非常可口。");
19 }
20
21 @Override
22 public void doWashing() {
23 System.out.print(name+" 叫了自己表弟來(lái)幫忙洗衣服,");
24 worker.doWashing();
25 }
26
27 }
這回對(duì)于洗衣服這活,Garin學(xué)精了,不親自動(dòng)手了,叫了一個(gè)外援;結(jié)果由于節(jié)省了大量洗衣服時(shí)間,廚藝那是突飛猛進(jìn),女朋友非常滿意,成功進(jìn)入下一階段。這個(gè)就是對(duì)象的適配器模式了,并不是所有人都有一個(gè)善于洗衣服的表弟。結(jié)果Garin通過(guò)歷練,順利從純情少男蛻變。
1 public class GirlFriendTest {
2
3 /**
4 * @param args
5 */
6 public static void main(String[] args) {
7 //使用類的代理模式
8 IIdealBoyFriend garin = new PuteBoy("Garin");
9 garin.doCooking();
10 garin.doWashing();
11 System.out.println("Garin成長(zhǎng)中











");
12 //使用對(duì)象的代理模式
13 garin = new SmartBoy("Garin");
14 ((SmartBoy)garin).callHelp(new BoyCanWashClothes("Garin 表弟"));
15 garin.doCooking();
16 garin.doWashing();
17 }
18
19 }