(設計模式)Adaptor、Decorator與Facade模式

deligation

委派機制。

參考鏈接:https://blog.csdn.net/Seriousplus/article/details/80462722

  1. 依賴: use a

  2. 關聯:has a

  3. 組合 Composition:a part of,一個對象包含另一個對象。直接在該類中實例化一個其他類。

  • 在組合中,當擁有的對象被銷燬時,所包含的對象也是如此
public class WebServer { 
    private HttpListener listener; 
    private RequestProcessor processor; 
    public WebServer() { 
        this.listener = new HttpListener(80); 
        this.processor = new RequestProcessor(/www/root”);
    } 
} 
  1. 聚集 Aggregation:對象在外部創建。作爲一個參數傳遞給構造函數。
public class WebServer { 
    private HttpListener listener; 
    private RequestProcessor processor; 
    public WebServer(HttpListener listener, RequestProcessor processor) {
        this.listener = listener;
        this.processor = processor;
    } 
}

適配器模式Adaptor

將某個類/接口轉換爲client期望的其他形式。通過增加一個接口,將已存在的子類封裝起來,client面向接口編程,從而隱藏了具體子類。

在這裏插入圖片描述

例子

在這裏插入圖片描述

裝飾器模式 Decorator

客戶端需要一個具有多種特性的object,通過一層一層的裝飾來實現。

爲對象增加不同側面的特性。對每一個特性構造子類,通過委派機制增加到對象上。
在這裏插入圖片描述

例子

在這裏插入圖片描述

interface Stack {
	void push(Item e);
	Item pop();
}
public abstract class StackDecorator implements Stack {
	protected final Stack stack;
	public StackDecorator(Stack stack) {
	this.stack = stack;
	}
	public void push(Item e) {
	stack.push(e);
	}
	public Item pop() {
	return stack.pop();
	}
	...
}
public class UndoStack extends StackDecorator implements Stack {
	private final UndoLog log = new UndoLog();
	public UndoStack(Stack stack) {
		super(stack);
	}
	public void push(Item e) {
		log.append(UndoLog.PUSH, e);
		super.push(e);
	}
	public void undo() {
	//implement decorator behaviors on stack
	}
	...
}

與繼承比較

  1. 功能組合
  • decorator是在運行時組合功能特性的
  • 繼承是在編譯時組合功能特性的
  1. 對象
  • decorator是多個對象通過delegation協作完成的

  • 繼承是單個有清晰特性的對象

  1. 多重繼承
  • decorator可以混合搭配多種decoration
  • 多重繼承概念上講是困難的

Facade 外觀模式

客戶端需要通過一個簡化的接口來訪問複雜系統內的功能

  • 提供一個統一的接口來取代一系列小接口調用,相當於對複雜系統做了一個封裝,簡化客戶端使用。

  • 便於客戶端學習使用,解耦

public class MySqlHelper {
	public static Connection getMySqlDBConnection() {}
	public void generateMySqlPDFReport
	(String tableName, Connection con){}
	public void generateMySqlHTMLReport
	(String tableName, Connection con){}
}

public class OracleHelper {
	public static Connection getOracleDBConnection() {}
	public void generateOraclePDFReport
	(String tableName, Connection con){}
	public void generateOracleHTMLReport
	(String tableName, Connection con){}
}

使用外觀模式

public class HelperFacade {
	public static void generateReport
	(DBTypes dbType, ReportTypes reportType, String tableName){
	Connection con = null;
	switch (dbType){
	case MYSQL:
	con = MySqlHelper.getMySqlDBConnection();
	MySqlHelper mySqlHelper = new MySqlHelper();
	switch(reportType){
	case HTML:
	mySqlHelper.generateMySqlHTMLReport(tableName, con);
	break;
	case PDF:
	mySqlHelper.generateMySqlPDFReport(tableName, con);
	break;
	}
	break;
	case ORACLE:}
	public static enum DBTypes { MYSQL,ORACLE; }
	public static enum ReportTypes { HTML,PDF;}
}

例子

在這裏插入圖片描述

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