配接器模式也叫包裝器,屬于結構型模式;就是把一個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起共組的兩個類能夠在一起作業,配接器模式的主要目的就是兼容性,配接器模式主要分為兩類:類配接器模式,物件配接器模式,
都知道中國的生活用電電壓是220V,而我們的智能手機充電器的輸出電壓是5V,那么手機充電器就是一個把220V高壓交流電轉為低壓直流電的一個配接器,在本模式中,就使用這個來作為例子,
類配接器模式:
類配接器模式就是把被適配的類的API轉換成為目標類的API,
類配接器模式的UML類圖如下:

這種模式所涉及到目標角色、源角色、配接器角色以下幾種角色:
- 目標角色:這就是所期待得到的角色,由于這里討論的是類配接器模式,所以目標角色不可以是類,應該是一個介面
- 源角色:需要適配的介面
- 配接器角色:配接器角色是本模式的核心,配接器把源介面轉換成目標介面,所以這一角色必須是一個具體的類
源角色:
package com.charon.adapter;
/**
* @className: Voltage220V
* @description: 源適配角色,220v電壓
* @author: charon
* @create: 2022-03-14 23:12
*/
public class Voltage220V {
public int output220V(){
int voltage = 220;
System.out.println("電壓 " + voltage + " 伏");
return voltage;
}
}
目標角色:
package com.charon.adapter;
/**
* @className: Voltage5V
* @description: 5v的適配介面
* @author: charon
* @create: 2022-03-14 23:09
*/
public interface Voltage5V {
/**
* 輸出5V電壓
* @return
*/
public int output5V();
}
配接器角色:
package com.charon.adapter;
/**
* @className: VoltageAdaptor
* @description: 電壓配接器角色
* @author: charon
* @create: 2022-03-15 21:36
*/
public class VoltageAdaptor extends Voltage220V implements Voltage5V {
@Override
public int output5V() {
int voltage = output220V();
return voltage / 44;
}
}
使用者:
package com.charon.adapter;
/**
* @className: Phone
* @description: 使用者
* @author: charon
* @create: 2022-03-15 21:37
*/
public class Phone {
public static void main(String[] args) {
Phone phone = new Phone();
phone.charging(new VoltageAdaptor());
}
public void charging(Voltage5V voltage5V){
if(5 == voltage5V.output5V()){
System.out.println("電壓為5V,可以進行充電~~~");
}else if(voltage5V.output5V() > 5){
System.out.println("電壓大于5V,不可以進行充電~~~");
}
}
}
類配接器模式優缺點:
- 由于配接器類是源的子類,因此可以在配接器類中重寫源角色的一些方法
- 由于只引進一個配接器類,因此只有一個路線到達目標類,使問題得到簡化
- 正是由于配接器類是源角色的子類,而java是單繼承的,如果有多個源需要適配,那這種方式就太過于繁瑣了
物件配接器模式:
與類配接器模式一樣,物件配接器模式是把被適配的類的API轉換成目標類的API,與類配接器模式不同的是,物件配接器模式不是使用繼承關系連接到Adaptee(源角色)類的,而是使用委派關系連接到Adaptee(源角色)類,即根據“合成復用原則”中的使用關聯關系代替繼承關系,
物件配接器模式的UML類圖如下:

物件配接器模式涉及到的角色和類配接器涉及到的角色一致,
相應的代碼也差不多,唯一的區別在于配接器角色:
package com.charon.adapter;
/**
* @className: VoltageAdaptor1
* @description: 物件配接器模式
* @author: charon
* @create: 2022-03-15 22:04
*/
public class VoltageAdaptor1 implements Voltage5V{
private Voltage220V voltage220V;
/**
* 通過構造器傳入一個Voltage220V的物件實體
* @param voltage220V
*/
public VoltageAdaptor1(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public int output5V() {
int outputV = 0;
if(null != voltage220V){
int inputV = voltage220V.output220V();
outputV = inputV / 44;
}
return outputV;
}
}
測驗:
package com.charon.adapter;
/**
* @className: Phone
* @description: 使用者
* @author: charon
* @create: 2022-03-15 21:37
*/
public class Phone {
public static void main(String[] args) {
Phone phone = new Phone();
phone.charging(new VoltageAdaptor1(new Voltage220V()));
}
public void charging(Voltage5V voltage5V){
if(5 == voltage5V.output5V()){
System.out.println("電壓為5V,可以進行充電~~~");
}else if(voltage5V.output5V() > 5){
System.out.println("電壓大于5V,不可以進行充電~~~");
}
}
}
列印:
電壓 220 伏
電壓為5V,可以進行充電~~~
物件配接器模式的優缺點:
- 一個配接器可以把多種不同的源角色適配到同一個目標角色,換言之,同一個配接器可以把源類和它的子類都適配到目標介面
- 與類配接器模式相比,要想置換源類的方法就不容易,如果一個要置換掉源類的一個或多個方法,就只好先做一個源類的子類,將源類的方法置換掉,然后再把源類的子類當作真正的源進行適配
- 雖然要想置換源類的方法不容易,但是要想增加一些新的方法則方便的很,而且新增加的方法可同時適用于所有的源
在什么情況下使用配接器模式:
- 系統需要使用現有的類,而此類的介面不符合系統的需要
- 想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起作業,這些源類不一定有很復雜的介面
- 對于物件配接器模式而言,在設計里,需要改變多個已有的子類的介面,如果使用類的配接器模式,就要針對每一個子類做一個配接器類,而這不太實際
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/445377.html
標籤:設計模式
上一篇:VscodeHaskell語法突出顯示顏色突然不起作用或丟失
下一篇:創建型:一. 單例模式
