適配器:在不改動以前接口代碼或者沒辦法更改以前接口代碼的情況下,讓以前的接口適用新的需求。
個人理解:適配器模式並不是設計框架的模式,而是一種萬不得已的補救措施,是在沒有辦法情況下采用的。條件允許的情況下,還是應該重構,而不是使用適配器去適用以前的舊代碼。
案例
1、生產充電器
某一天某充電器廠商老闆找到某設計師,要求設計師幫他設計一款充電器。在一番思考之後,設計師寫下來如下的代碼:
/**
* 充電器接口
* @Description
* @author smallking
* @Date 2020年3月20日
*/
public interface ICharge {
void charge();
}
/**
* 安卓充電器
* @Description
* @author smallking
* @Date 2020年3月20日
*/
public class AndroidCharge implements ICharge{
@Override
public void charge() {
System.out.println("安卓充電器");
}
}
/**
* 蘋果充電器
* @Description
* @author smallking
* @Date 2020年3月20日
*/
public class AppleCharge implements ICharge{
@Override
public void charge() {
System.out.println("蘋果充電器");
}
}
老闆看到設計師的設計之後,覺得這個想法很不錯,能掙蘋果用戶的錢,也能掙安卓用戶的錢。於是回到公司之後,老闆立馬斥巨資建起了流水線,生產了起來。果不其然,生產出來的產品大賣,賺了很多錢。故事就此告一段落。
2、生產閃光燈
過了一陣子,老闆又找到了設計師,要求設計師給他設計閃光燈,他想買閃光燈賺錢。設計師經過一番思考之後,寫下了如下代碼:
/**
* 閃光功能接口
* @Description
* @author smallking
* @Date 2020年3月20日
*/
public interface IFlash {
void flash();
}
public class BlingBlingFlash implements IFlash {
@Override
public void flash() {
System.out.println("發出bulingbuling的閃光");
}
}
廠長藉助這個閃光燈,又大賺特賺了一筆。
3、會閃光的充電器
廠長某一天突發奇想,我的充電器大賣,閃光燈大賣。那如果我要是生產一種會閃光的充電器,那不得起飛嘍?於是他又找到設計師,把自己的想法告訴了他。設計師一想,這個還不簡單?於是他馬上給到了廠長方案:
/**
* 充電器接口
* @Description
* @author smallking
* @Date 2020年3月20日
*/
public interface ICharge extends IFlash{
void charge();
}
讓充電器接口繼承IFlash接口,那麼充電器不就又能充電又能閃光,成了一個會閃光的充電器了嗎?但是廠長接到方案之後,卻暴跳了起來:老子斥巨資,好不容易把充電器流水線搭建起來,你現在卻要改造我的充電器流水線。你知道這個要花多少錢嗎?這個方案我不接受!總之,以前的東西都不能改,我還要充電器能閃光。
4、適配器模式
在廠長的強硬態度之下,設計師知道,重構是行不通了,無奈之下只好拿出來了適配者模式。
/**
* 充電器適配器類
* @Description
* @author smallking
* @Date 2020年3月20日
*/
public class ChargeAdapter implements IFlash {
private ICharge charge;
public ChargeAdapter() {
}
public ChargeAdapter(ICharge charge) {
this.charge = charge;
}
/**
* 邊充電 + 閃光
*/
public void flash() {
charge.charge();
System.out.println("閃光");
}
public ICharge getCharge() {
return charge;
}
public void setCharge(ICharge charge) {
this.charge = charge;
}
}
測試代碼:
class AdapterTest {
public static void main(String[] args) {
// 生產一個蘋果充電器
ICharge appleCharge = new AppleCharge();
// 生產一個安卓充電器
ICharge androidCharge = new AndroidCharge();
// 蘋果裝入適配器
ChargeAdapter adapter1 = new ChargeAdapter();
adapter1.setCharge(appleCharge);
// 安卓裝入適配器
ChargeAdapter adapter2 = new ChargeAdapter();
adapter2.setCharge(androidCharge);
adapter1.flash();
adapter2.flash();
}
}
廠長看到方案之後,又露出了資本家的微笑。這纔對嘛,以前的東西都建了好了,我纔不去改它,我寧願新建一個適配器,這樣多省事。 但是廠長不知道的是,這樣發發展下去,遲早有一天,他的工廠集團會亂作一團。
以上就是個人對於適配器模式的理解,如有不對,請指出探討。