适配器模式定义
适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
适配器有两种类型:对象适配器、类适配器
对象适配器
UML类图
类适配器
UML类图
个人认为两者的优劣势
对象适配器:
使用组合,不仅可以适配某个类,也可以适配该类的任何子类,一般而言,是单向的适配;
类适配器(注:Java中没有多重继承):
使用继承,不好扩展到别的子类,但可以双向适配;
采用对象适配器的代码
Duck.java
public interface Duck {
public void quack();
public void fly();
}
MallarDuck.java
public class MallardDuck implements Duck {
public void quack() {
// TODO Auto-generated method stub
System.out.println("MallacDuck Quack");
}
public void fly() {
// TODO Auto-generated method stub
System.out.println("MallacDuck is flying");
}
}
Turkey.java
public interface Turkey {
public void gobble();
public void fly();
}
WildTurkey.java
public class WildTurkey implements Turkey {
public void gobble() {
// TODO Auto-generated method stub
System.out.println("WildTurkey gobble");
}
public void fly() {
// TODO Auto-generated method stub
System.out.println("WildTurkey is flying a short distance");
}
}
让火鸡适配鸭子
TurkeyAdapter.java
public class TurkeyAdapter implements Duck {
Turkey turkey;
public TurkeyAdapter(Turkey turkey){
this.turkey = turkey;
}
public void quack() {
// TODO Auto-generated method stub
turkey.gobble();
}
public void fly() {
// TODO Auto-generated method stub
turkey.fly();
}
}
现在做一个鸭子类接口测试,但想用火鸡了
DuckTest.java
public class DuckTest {
public static void main(String[] args) {
MallardDuck duck = new MallardDuck();
testDuck(duck);
System.out.println("--------------------");
WildTurkey turkey = new WildTurkey();
turkey.gobble();
turkey.fly();
System.out.println("--------------------");
Duck turkeyAdapter = new TurkeyAdapter(turkey);
testDuck(turkeyAdapter);
}
static void testDuck(Duck duck){
duck.quack();
duck.fly();
}
}
输出
MallacDuck Quack
MallacDuck is flying
--------------------
WildTurkey gobble
WildTurkey is flying a short distance
--------------------
WildTurkey gobble
WildTurkey is flying a short distance
现在又做火鸡测试类,但又想能用鸭子,所以还要写一个能适配火鸡的鸭子适配器
DuckAdapter.java
public class DuckAdapter implements Turkey {
Duck duck;
public DuckAdapter(Duck duck){
this.duck = duck;
}
public void gobble() {
// TODO Auto-generated method stub
duck.quack();
}
public void fly() {
// TODO Auto-generated method stub
duck.fly();
}
}
开始测试
public class TurkeyTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
MallardDuck duck = new MallardDuck();
Turkey duckAdapter = new DuckAdapter(duck);
duckAdapter.gobble();
duckAdapter.fly();
}
}
输出
MallacDuck Quack
MallacDuck is flying