posts - 262,  comments - 221,  trackbacks - 0
适配器的几种用法

一、要适配的功能来自两个互不关联的类

例如:

public class A { public void someFunctionOfA();}

public class B { public void someFunctionOfB();}

适配器的设计如下

public class C extends A {

    private class B b ;

    public C (B b) { this.b = b; }

    public someFunctionOfAandB () {
        super.someFunctionOfA();
        b.someFunctionOfB();
    } 



我们知道因为Java中不允许多重继承,所以这里类C首先继承了类A,这样它就具有了类A的功能了,特别是我们要注意到类C中包含了一个类B的成员变量,这样类C也间接地具有了类B的功能(因为类C要实现的功能实际是委托其成员变量b来完成) 。


二、要适配的功能来自两个互不关联的接口,其目前没有实现类

例如:

public interface A { public void someFunctionOfA(); }

public interface B { public void someFunctionOfB(); }

适配器的设计如下

public class C implements A, C {

    public void someFunctionOfA(){....}

    public void someFunctionOfB(){....}  

}

这是最简单也是最常用的方式,但只适合于目前没有实现类的情况,如果我们的系统已经有了实现类,要再在新适配器里面重新实现,无异于重新发明车轮。


三、要适配的功能来自两个互不关联的接口,但已经有实现类

这种情况和情况一很像,但方式一强迫适配器必须继承其中某一个类,那么以后适配器的子类将不能继承其它的父类,但是因为有了接口,我们可以使用“two-way-adpater”的方式

例如:

public interface Ia { public void someFunctionOfA(); }

public interface Ib { public void someFunctionOfB(); }

public class A implements Ia { public void someFunctionOfA(){...} }

public class B implements Ib { public void someFunctionOfB(){...} }

public class C implements Ia, Ib {

    private Ia ia ;
    private Ib ib ;

    public C(Ia ia) { this.ia = ia;}

    public C(Ib ib) { this.ib = ib;}

    public void someFunctionOfA(){  
        ia.someFunctionOfA();
    }

    public void someFunctionOfB(){
        ib.someFunctionOfB();
    }

}

我们可以看到这里适配器C没有继承那一个特定的类,相反它实现了所有的接口,但它重载了构造方法,我们可以根据需要来让适配器适配想要的功能。

比如:现在我们想让适配器适配接口Ia的功能,那么我们将调用适配器的public C(Ia ia),传入一个Ia接口的实例,再调用someFunctionOfA();如果我们想要适配接口Ib的功能,那么只需要调用构造方法public C(Ib ib),再调用someFunctionOfB()。

这样的好处就是适配器是动态的,我们可以控制适配器在某个适合适配某个想要的功能,而不会像方式一一样不管三七二十一,把所有的功能都实现了。


四、要适配的功能来自一个类和一个接口

例如:

public class A { public void someFunctionOfA(){....}}

public interface B { public void someFunctionOfB(); }

适配器的设计如下

public class C extends A implements B {
   
  public void someFunctionOfB(){...}

    public void someFunctionOfAandB(){
        super.someFunctionOfA();
        someFunctionOfB();
   }

}

从上面的四种方式来看,方式二最简单也最常用,方式三最灵活,方式一和四有相同的地方就是都继承了其中的某一个类,这样就限制了适配器的子类不能再继承其它的功能父类了,不同的地方是方式一使用委托的方式来完成类B的功能,而方式四则自己实现了接口的方法。


-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2008-01-14 17:50 Paul Lin 阅读(1421) 评论(0)  编辑  收藏 所属分类: 模式与重构

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


网站导航:
 
<2008年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(21)

随笔分类

随笔档案

BlogJava热点博客

好友博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜