OO适配器将一个接口转换为另一个接口,以符合客户的需求。
Duck和Turkey之间的关系。。。
public interface Duck {
public void quack();
public void fly();
}
public class MallardDuck implements Duck{
public void quack(){
System.out.println("Quack");
}
public void fly(){
System.out.println("im flying");
}
}
public interface Turkey {
public void gobble();
public void fly();
}
public class WildTurkey implements Turkey{
public void gobble(){
System.out.println("Gobble gooble");
}
public void fly(){
System.out.println("im flying a short distance");
}
}
public class TurkeyAdapter implements Duck{
Turkey turkey;
public TurkeyAdapter(Turkey turkey){
this.turkey=turkey;
}
public void quack(){
turkey.gobble();
}
public void fly(){
for(int i=0;i<5;i++)
turkey.fly();
}
}
测试:
public class DuckTestDrive {
public static void main(String[]args){
MallardDuck duck=new MallardDuck();
WildTurkey turkey=new WildTurkey();
Duck turkeyAdapter=new TurkeyAdapter(turkey);
System.out.println("The turkey says...");
turkey.gobble();
turkey.fly();
System.out.println("\nThe duck says...");
testDuck(duck);
System.out.println("\nThe turkeyAdapter says...");
testDuck(turkeyAdapter);
}
static void testDuck(Duck duck){
duck.quack();
duck.fly();
}
}
result:
The turkey says...
Gobble gooble
im flying a short distance
The duck says...
Quack
im flying
The turkeyAdapter says...
Gobble gooble
im flying a short distance
im flying a short distance
im flying a short distance
im flying a short distance
im flying a short distance
适配器让原本接口不兼容的类可以合作无间。
以上是对象的适配器,还有类的适配器
比如旧世界的枚举器Enumeration适配到新世界的迭代器Iterator,编写一个EnumerationIterator适配器
public class EnumerationIterator implements Iterator{
Enumeration enum;
public EnumerationIterator(Enumeration enum ){
this.enum=enum;
}
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
return enum.hasMoreElement();
}
@Override
public Object next() {
// TODO Auto-generated method stub
return enum.nextElement();
}
@Override
public void remove() {
// TODO Auto-generated method stub
throw new UnsupportedOperationException();
}
}
类似的还有一种模式,外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更加容易使用。
比如家庭影院系统就很适合。
Facade并没有封装子系统的类,只是提供简化的接口,所以你可以直接使用子系统的类。也允许你将客户实现从任何子系统中解耦。
外观和适配器可以包装很多类,但是前者的意图是简化接口,而后者是将接口转换成不同接口。
涉及到一个设计原则:最少知识原则。也就是不要让太多的类耦合在一起。