(设计模式)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;}
}

例子

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/JAck_chen0309/article/details/105282501
今日推荐