來源:軟件祕笈------設計模式那點事兒
適配器模式(Adapter Pattern)
定義:把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因爲接口不匹配而無法在一起工作的兩個類能夠在一起工作,又稱爲轉換器模式、變壓器模式、包裝模式。
(1)對象適配器模式:在該模式中,適配器容納一個它包裹的類的實例。在這種情況下,適配器其調用被包裹的對象的物理實體。
(2)類適配器模式:在該模式下,適配器其繼承自己實現的類。
下面以對象適配器爲例。
模式類圖結構:
使用場合:
(1)、軟件系統結構需要升級或擴展,又不想影響原有系統的穩定運行的時候。
(2)、轉換類三支箭的差別不是太大的時候。
(3)、像創建一個可以服用的類,該類可以與其他不相關的類,或不可預見的類協同工作的時候。
代碼實現:
//電源基類,提供電壓值和電源單位
package com.demo.power;
public abstract class AbsBasePower {
private float power; //電壓值
private String unit = "V"; //電壓單位
public AbsBasePower(float power)
{
this.power = power;
}
public float getPower() {
return power;
}
public void setPower(float power) {
this.power = power;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
}
//220V電源接口
package com.demo.power.v220;
public interface IPower220 {
public void output220v();
}
//220V電源
package com.demo.power.v220;
import com.demo.power.AbsBasePower;
public class Power220 extends AbsBasePower implements IPower220{
public Power220(){
super(220);
}
@Override
public void output220v() {
System.out.println("------- 這是"+this.getPower()+this.getUnit()+"電源-----");
}
}
//12V電源接口
package com.demo.power.v12;
public interface IPower12 {
//輸出12v電壓s
public void output12V();
}
//12V電源對象適配器
package com.demo.power.v12;
import com.demo.power.AbsBasePower;
public class AdapterPower12 implements IPower12 {
private final AbsBasePower absBasePower;
public AdapterPower12(AbsBasePower absBasePower){
this.absBasePower = absBasePower;
}
@Override
public void output12V() {
float powerFloat = this.absBasePower.getPower();
if(powerFloat == 380){
powerFloat /= 31.67f;
}
else if(powerFloat == 220){
powerFloat /= 18.33f;
}
else if (powerFloat == 110){
powerFloat /= 9.17f;
}
else{
System.out.println("不能適配電源");
}
//處理轉換結果
powerFloat = (int) (powerFloat * 10)/10.0f;
System.out.println("------- 這是"+powerFloat+this.absBasePower.getUnit()+"電源-----");
}
}
//測試對象適配器
package com.demo;
import com.demo.power.v12.AdapterPower12;
import com.demo.power.v12.IPower12;
import com.demo.power.v220.Power220;
public class Client {
public static void main(String[] args){
Power220 power220 = new Power220();
System.out.println("適配器轉換之前");
power220.output220v();
System.out.println("適配器開始轉換。。。。。。");
System.out.println("適配器轉換之後");
IPower12 adapterPower12 = new AdapterPower12(power220);
adapterPower12.output12V();
}
}