擴充卡模式定義
擴充卡模式将一個類的接口,轉換成客戶期望的另一個接口。擴充卡讓原本接口不相容的類可以合作無間。
擴充卡有兩種類型:對象擴充卡、類擴充卡
對象擴充卡
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