silvermyth

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  1 随笔 :: 12 文章 :: 1 评论 :: 0 Trackbacks
从应用的角度来看,适配器模式在代码中应用的机会并不多。但从生活角度看,非常直观生动,容易理解。去过美国的朋友都知道在去之前需要准备一个电源的转换器,因为美国的插座格式和中国的不同,需要在中间做一个转换,这是一个非常经典的适配器模式的例子。适配器模式就是把不适应的接口变成适应(或者叫做期望)的接口。
我原来有一个同事,名字叫做Garin,从小就会洗衣服,但是不会做饭;第一次找了个女朋友,结果人家女孩要求基本条件就是会洗衣做饭。
1 public interface IIdealBoyFriend {
2     public void doCooking();
3     public void doWashing();
4 }
5 
一看不对呀,接口不匹配,怎么办,简单,适配吧:
 1 public class BoyCanWashClothes {
 2     
 3     private String name = null
 4     
 5     public void doWashing(){
 6         System.out.println(name +" 费了九牛二虎之力总算洗完了衣服,好累啊。");
 7     }
 8 
 9     public BoyCanWashClothes(String name) {
10         super();
11         this.name = name;
12     }
13     
14 }
只会做饭,不会洗衣服;适配以后:
 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+"找了个菜谱,倒腾了半天,终于把饭做熟了。");
10     }
11 
12 }
妥了,学会做饭了。细心的同学可能发现,上面的例子其实是类的适配器模式,不但Garin能适配,Tom也能,James也可以。话说Garin用适配器模式摇身一变,会做饭了,但是由于缺乏修炼(还要花大量时间洗女朋友的脏衣服),饭菜味道不地道,女朋友和他吹了。又过了一段时间,Garin又找了个新的女朋友,还是得会洗衣做饭,而且规定衣服不能机洗,只能手洗。这回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+" 聚精会神做菜,满满的都是爱,饭菜非常可口。");
19     }
20 
21     @Override
22     public void doWashing() {
23         System.out.print(name+" 叫了自己表弟来帮忙洗衣服,");
24         worker.doWashing();
25     }
26 
27 }
这回对于洗衣服这活,Garin学精了,不亲自动手了,叫了一个外援;结果由于节省了大量洗衣服时间,厨艺那是突飞猛进,女朋友非常满意,成功进入下一阶段。这个就是对象的适配器模式了,并不是所有人都有一个善于洗衣服的表弟。结果Garin通过历练,顺利从纯情少男蜕变。
 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成长中");
12         //使用对象的代理模式
13         garin = new SmartBoy("Garin");
14         ((SmartBoy)garin).callHelp(new BoyCanWashClothes("Garin 表弟"));
15         garin.doCooking();
16         garin.doWashing();
17     }
18 
19 }
posted on 2015-07-27 22:51 Gavin Li 阅读(85) 评论(0)  编辑  收藏 所属分类: 设计模式

只有注册用户登录后才能发表评论。


网站导航: