前言
部落客github
部落客個人部落格http://blog.healerjean.com
1、Adapter模式有兩種
1、類擴充卡模式(使用繼承的擴充卡)
2、對象擴充卡 (使用委托的擴充卡)
1.2、擴充卡模式和裝飾器模式的差別
裝飾器與擴充卡都有一個别名叫做 包裝模式(Wrapper),它們看似都是起到包裝一個類或對象的作用,但是使用它們的目的很不一一樣。
擴充卡模式将一個接口轉變成另一個接口,它的目的是通過改變接口來達到重複使用的目的。當然也有适配之前的,并且建立跟多的方法。 因為新舊接口不一緻導緻出現了用戶端無法得到滿足的問題,但是,由于舊的接口是不能被完全重構掉的(比如不是我們代碼中,而是别的jar包的對象),因為我們還想使用實作了這個接口的一些服務。那麼為了使用以前實作舊接口的服務,我們就應該把新的接口轉換成舊接口;實作這個轉換的類就是抽象意義的轉換器
裝飾器模式不是要改變被裝飾對象的接口,而是恰恰要保持原有的接口,但是增強原有對象的功能,或者改變原有對象的處理方式而提升性能。是以這兩個模式設計的目的是不同的。
2、執行個體程式
現在實際情況是 我們的電壓是100V的,但是我們想要的是220V的電壓,現在我們希望底層還是用它,也就是說基于100V 的實作,但是我們以後都不會再用着100V了
1、實際情況
1.1.1、實際情況Banner
/**
* 目前的實際情況
*/
public class Banner {
public String string;
public Banner(String string) {
this.string = string;
}
public void showWithParen() {
System.out.println("(" + string + ")");
}
public void showWithAster() {
System.out.println("*" + string + "*");
}
}
1.1.2、測試Main
public class Main {
public static void main(String[] args) {
Banner s = new Banner("\"Hello\"") ;
s.showWithAster();
s.showWithParen();
}
2、第一種:使用繼承的擴充卡
[外鍊圖檔轉存失敗(img-Y5DWBsbr-1566550452735)(https://raw.githubusercontent.com/HealerJean/HealerJean.github.io/master/blogImages/1558686754766.png)]
1.2、 Print
接口
Print
public interface Print {
void printWeak();
void printStrong();
}
1.3、 PrintBanner
擴充卡,繼承實作
PrintBanner
擴充卡繼承上面的banner,這樣就具備了banner裡面的公共屬性
/**
* 擴充卡角色
*/
public class AdapterPrintBanner extends Banner implements Print {
public AdapterPrintBanner(String string) {
super(string);
}
@Override
public void printWeak() {
showWithParen();
}
@Override
public void printStrong() {
showWithAster();
}
}
1.4、測試Main
public class Main {
public static void main(String[] args) {
Print p = new AdapterPrintBanner("Hello");
p.printWeak();
p.printStrong();
}
}
3、第二種:使用委托的擴充卡
3.1、 Print
抽象類
Print
public interface Print {
void printWeak();
void printStrong();
}
3.2、AdapterPrintBanner 擴充卡委托實作
/**
* 擴充卡,委托實作,聚合
*/
public class AdapterPrintBanner implements Print {
private Banner banner;
public AdapterPrintBanner(String string) {
this.banner = new Banner(string);
}
@Override
public void printWeak() {
banner.showWithParen();
}
@Override
public void printStrong() {
banner.showWithAster();
}
}
3.2、測試Main
public class Main {
public static void main(String[] args) {
Print p = new AdapterPrintBanner("Hello");
p.printWeak();
p.printStrong();
}
}
4、現在的情況
我們使用的是Print接口來進行程式設計的,對于Mian而言,Banner類中的被隐藏起來了,這就比如是220V的工作了起來,但是實際上是100V的電壓轉化而成的。
5、UML
4…1、 類擴充卡模式(使用繼承)
4.2、對象擴充卡模式(使用委托)
[外鍊圖檔轉存失敗(img-LrxLbqlj-1566550452737)(https://raw.githubusercontent.com/HealerJean/HealerJean.github.io/master/blogImages/1558689101738.png)]
5、Adapter登場角色
5.1、Target(對象)
該角色負責定義所需要的方法,示例程式中
Print
所扮演的角色
5.2、Client(請求者)
該角色負責使用
Target
角色所定義的方法進行具體處理,示例程式中的
Main
扮演這個角色
5.3、Adapter (擴充卡 )
該角色是主人公,使用Adaptee角色的方法比對舊的需求,然後
實作
或者
繼承
Print來滿足現狀的需求
5.4、Adaptee(被适配)
該角色是被适配的角色