設計模式 - Adapter

Adapter 模式:

  • 將兩個不相關的類組合在一起使用,需要用到Adapter模式。一個是Adaptee,一個是Adapter。

  • 實際上,兩個不相關的類想要組合在一起使用, 可以修改類的接口, 但是,如果我們不想修改接口,或者根本沒有源代碼,就需要使用Adapter模式。

  • 有一個接口用於提供需求,一個類用於實現需求,但是需要用一個類將兩者聯繫起來進行轉換,這個轉換的類就是Adapter(適配器)

實例:

  • Print 接口有兩個方法,一個是輸出*號修飾的字符串,一個輸出<>包括的字符串。
  • Banner 類是一個擁有兩個可以實現Print接口功能的方法,而我們不想修改Print接口來配合Banner的工作,所以這個時候需要使用PrintBanner類來把兩者聯繫起來。

Print 接口:


public interface Print {
	public void printWithStar();
	public void printWithPointBracket();
}

Banner 類:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Banner {
	private String bannerName;
	private final Logger LOGGER = LoggerFactory.getLogger(Banner.class);
	public Banner(String bannerName) {
		this.bannerName = bannerName;
	}
	public void showWithStar() {
		LOGGER.info("{}","***"+ bannerName +"***");
	}
	public void showWithPointBracket() {
		LOGGER.info("{}","<<<" + bannerName + ">>>");
	}
}

PrintBanner 類:


public class PrintBanner extends Banner implements Print{
	public PrintBanner(String bannerName) {
		super(bannerName);
	}

	@Override
	public void printWithStar() {
		showWithStar();
		
	}

	@Override
	public void printWithPointBracket() {
		showWithPointBracket();
		
	}
	
}

測試用例以及結果:

public void AdapterPatternTest() {
		PrintBanner printBanner = new PrintBanner("Adapter");
		printBanner.showWithStar();
		printBanner.showWithPointBracket();
	}

16:42:12.730 [main] INFO com.zyy.admin.pojo.Banner - ***Adapter***
16:42:12.732 [main] INFO com.zyy.admin.pojo.Banner - <<<Adapter>>>

什麼時候使用Adapter模式:

  • 當有一些類被測試過多冊,Bug很少,這個時候我們開發一些新的接口時,可以選擇複用這些類,這個時候就需要Adapter模式來把兩者聯繫起來。
  • 版本升級時,我們把舊的代碼作爲Adaptee,用Adapter作爲新版本。
  • 假如有一個接口需要實現一些方法,現在有一個類滿足它的要求,而且已經測試完畢,Bug很少,這個時候我們有兩者選擇,一個是直接修改類的實現方法來滿足接口的實現,另一個則是使用Adapter來承接兩者。我們需要考慮到如果這個類與它關聯的不只是這一個接口時,直接修改是不是會增大測試的成本,其他依賴這個類的模塊會不會受影響,這樣耦合度是不是太高了。所以,這個時候使用Adapter模式,我們既複用了已經測試好的類,更不會影響到與這個類關聯的其他模塊。
  • 如果接口的實現和類的功能完全不同,那麼我們也就完全沒有必要使用Adapter模式。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章