通俗易懂的適配器模式

適配器:在不改動以前接口代碼或者沒辦法更改以前接口代碼的情況下,讓以前的接口適用新的需求。

個人理解:適配器模式並不是設計框架的模式,而是一種萬不得已的補救措施,是在沒有辦法情況下采用的。條件允許的情況下,還是應該重構,而不是使用適配器去適用以前的舊代碼。

案例

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();
    }
    
}

廠長看到方案之後,又露出了資本家的微笑。這纔對嘛,以前的東西都建了好了,我纔不去改它,我寧願新建一個適配器,這樣多省事。 但是廠長不知道的是,這樣發發展下去,遲早有一天,他的工廠集團會亂作一團。

以上就是個人對於適配器模式的理解,如有不對,請指出探討。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章