加個"擴充卡"以便于複用
1.使用情況
在程式世界中,經常存在現有的程式無法直接使用,需要适當的變化才能使用.這種用于填補倆個程式之間差異的設計模式就是擴充卡模式。
擴充卡模式分為以下倆種:
- 類擴充卡模式(使用繼承的擴充卡)->類和接口
- 對象擴充卡模式(使用委托的擴充卡)->倆個類
2.類擴充卡

程式類圖
Banner類
/**
* @author Jay
* @date 2019/5/23 22:52
* @description
*/
public class Banner {
private String string;
public Banner(String string) {
super();
this.string = string;
}
/**
* 括号方式
*/
public void showWithParen() {
System.out.println("(" + string + ")");
}
/**
* 星号方式
*/
public void showWithAster() {
System.out.println("*" + string + "*");
}
}
Print接口
/**
* @author Jay
* @date 2019/5/23 22:54
* @description 定義列印接口
*/
public interface Print {
/**
* 定義列印方式
*/
void printWeak();
/**
* 不同的列印方式
*/
void printStrong();
}
PrintBanner類:擴充卡,實作接口又繼承類,可以使用倆者的方法.
/**
* @author Jay
* @date 2019/5/23 22:55
* @description 擴充卡,實作接口又繼承類,可以使用倆者的方法.
*/
public class PrintBanner extends Banner implements Print {
/**
* 擴充卡對象
*/
public PrintBanner(String string) {
super(string);
// 父類隻有一個構造器則子類隻能調用父類唯一構造器
// 需把值傳入
}
@Override
public void printWeak() {
//有個隐式的super可以調用父類方法
super.showWithParen();
}
@Override
public void printStrong() {
showWithAster();
}
}
Main
/**
* @author Jay
* @date 2019/5/23 23:01
* @description
*/
public class Main {
/**
* 測試類
*/
public static void main(String[] args) {
//接口引用接收其實作類對象
Print p = new PrintBanner("Hello");
//隻能調用從接口實作的方法以及子類自己的方法,無法調用父類.
p.printStrong();
p.printWeak();
}
}
Banner類中具體方法實作細節對Main完全隐藏,Main不知道PrintBanner中如何實作,這樣就可以在不對Main類修改的情況下改變PrintBanner的具體實作細節。
3.對象擴充卡(使用委托)
Banner類
/**
* @author Jay
* @date 2019/5/23 22:52
* @description
*/
public class Banner {
private String string;
public Banner(String string) {
super();
this.string = string;
}
/**
* 括号方式
*/
public void showWithParen() {
System.out.println("(" + string + ")");
}
/**
* 星号方式
*/
public void showWithAster() {
System.out.println("*" + string + "*");
}
}
Print類
/**
* @author Jay
* @date 2019/5/23 23:13
* @description
*/
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
PrintBanner類
/**
* @author Jay
* @date 2019/5/23 23:13
* @description
*/
public class PrintBanner extends Print {
/**
* 使用組合将倆個類方法都可以調用
*/
private Banner banner;
public PrintBanner(String string) {
// 構造函數建立Banner對象
this.banner = new Banner(string);
}
@Override
public void printWeak() {
banner.showWithParen();
}
@Override
public void printStrong() {
banner.showWithAster();
}
}
Main
public class Main {
//測試類
public static void main(String[] args) {
Print p = new PrintBanner("Hello");//接口引用接收其實作類對象
//隻能調用從接口實作的方法以及子類自己的方法,無法調用父類.
p.printStrong();
p.printWeak();
}
}
4.擴充卡的各種角色
Target(對象)
該角色負責定義所需的方法.示例中Print接口(被實作)和Print類(被委托)
ex:筆記本電腦工作所需12v電源
Clint(請求者)
該角色負責将Target所定義的方法具體實作.示例中的Main類.
ex:筆記本電腦
Adaptee(被适配)
持有既定方法的角色 ,Banner類
ex:220v電源
Adapter(擴充卡)
使用Adaptee角色的方法來滿足Target角色的需求.PrintBanner類
ex:電源擴充卡
擴充卡實作的倆種模式:
使用繼承:
使用委托:
可以将穩定代碼,封裝好的代碼重複利用,用擴充卡進行組裝,進而生成新的類,友善代碼的排查.
To GitHub