1. 程式人生 > >設計模式(二): Adapter模式(介面卡模式)

設計模式(二): Adapter模式(介面卡模式)

Adapter模式(介面卡模式)

介面卡模式

1.類介面卡模式(繼承)

基礎類,提供printWithParen()方法來列印帶()的內容,提供printWithAster()方法來提供帶*號的內容:
Banner.java

public class Banner {

	private String show;

	public Banner(String show) {
		this.show = show;
	}

	// 列印加括號
public void printWithParen() { System.out.println("(" + show + ")"); } // 列印加*號 public void printWithAster() { System.out.println("*" + show + "*"); } }

現在的需求是要提供printWeak和printStrong方法分別列印括號和星號。
Print.java

/**
 * 需求介面,要一個printWeak和printStrong分別列印括號和星號
 */
public interface Print {

	// 列印()
void printWeak(); // 列印* void printStrong(); }

介面卡類,printWeak,printStrong方法使用printWithParen,printWithAster方法來實現。
所以通過繼承來獲取Banner 中printWithParen,printWithAster方法,並 實現Print 介面,實現printWeak,printStrong方法。
PrintBanner.java

// 介面卡類,繼承Banner類獲得printWithParen、printWithAster方法,實現Print介面,實現需求 提供適配
public
class PrintBanner extends Banner implements Print{ public PrintBanner(String show) { // 父類構造器 即Banner類的構造器 super(show); } @Override public void printWeak() { // 繼承的方法 printWithParen(); } @Override public void printStrong() { // 繼承的方法 printWithAster(); } }

測試類:

@Test
public void test() {
	Print p = new PrintBanner("demo");
	p.printWeak();
	p.printStrong();
}

控制檯列印:

(demo)
*demo*

Print p = new PrintBanner(“demo”),面向Print介面程式設計,printWeak,printStrong方法的實現,對於呼叫者完全隱藏。

委託介面卡模式(物件)

上面的示例是通過呼叫 繼承的來的printWithParen,printWithAster方法來實現的。也可以 通過具體對像來呼叫。
Banner.java

public class Banner {

	private String show;

	public Banner(String show) {
		this.show = show;
	}

	public void printWithParen() {
		System.out.println("(" + show + ")");
	}
	
	public void printWithAster() {
		System.out.println("*" + show + "*");
	}

}

Print.java

public interface Print {

	void printStrong();

	void printWeak();
}

PrintBanner.java

// 實現介面方式,不需要繼承
public class PrintBanner implements Print {
	
	// 物件例項
	private Banner banner;
	
	public PrintBanner(String show) {
		this.banner = new Banner(show);
	}
	

	@Override
	public void printStrong() {
		banner.printWithParen();		
	}

	@Override
	public void printWeak() {
		banner.printWithAster();
	}

}

測試:

@Test
public void test() {
	Print print = new PrintBanner("hello");
	print.printStrong();
	print.printWeak();
}

控制檯列印 :

(hello)
*hello*

記錄

Adapter模式會對現有的類進行適配,生成新的類。通過該模式可以很方便的建立我們需要的方法群 。不改變原有類,生成新的類。Adapter模式填補具有不同介面的兩個類之間的縫隙。角色功能完全不同則不能使用Adapter模式。