适配器的几种用法
一、要适配的功能来自两个互不关联的类
例如:
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 阅读(1430)
评论(0) 编辑 收藏 所属分类:
模式与重构