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