deligation
委派機制。
參考鏈接:https://blog.csdn.net/Seriousplus/article/details/80462722
-
依賴: use a
-
關聯:has a
-
組合 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”);
}
}
- 聚集 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
}
...
}
與繼承比較
- 功能組合
- decorator是在運行時組合功能特性的
- 繼承是在編譯時組合功能特性的
- 對象
-
decorator是多個對象通過delegation協作完成的
-
繼承是單個有清晰特性的對象
- 多重繼承
- 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;}
}