外观模式

外观模式 的定义:

        为子系统中的一组接口提供一个 一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

外观模式在现实生活中的示例很多,比如组装电脑,通常会有两种方案

方案一:

外观模式_第1张图片

方案二:

外观模式_第2张图片

这个专业的装机公司就相当于本设计模式的主角-外观模式(Facade)


外观模式的实际应用:代码生成工具:

代码生成工具的模块示意图:

外观模式_第3张图片

相应的代码:

配置model:

/**
 * 配置描述的model
 * 
 * @author Administrator
 *
 */
public class ConfigModel {

	/**
	 * 是否需要生成表现层,默认为true
	 */
	private boolean needGenPresentation = true;
	/**
	 * 是否需要生成逻辑层,默认为true
	 */
	private boolean needGenBusiness = true;
	/**
	 * 是否主要生成DAO,默认为true
	 */
	private boolean needGenDAO = true;

	public boolean isNeedGenPresentation() {
		return needGenPresentation;
	}

	public void setNeedGenPresentation(boolean needGenPresentation) {
		this.needGenPresentation = needGenPresentation;
	}

	public boolean isNeedGenBusiness() {
		return needGenBusiness;
	}

	public void setNeedGenBusiness(boolean needGenBusiness) {
		this.needGenBusiness = needGenBusiness;
	}

	public boolean isNeedGenDAO() {
		return needGenDAO;
	}

	public void setNeedGenDAO(boolean needGenDAO) {
		this.needGenDAO = needGenDAO;
	}

}

配置管理:

/**
 * 配置管理,就是负责读取配置文件 并把配置文件的内容设置到配置Model中去,是个单例
 * 
 * @author Administrator
 *
 */
public class ConfigManager {
	private static volatile ConfigManager manager = null;

	private static ConfigModel cm = null;

	private ConfigManager() {
	}

	public static ConfigManager getInstance() {
		if (manager == null) {
			synchronized (ConfigManager.class) {
				if (manager == null) {
					manager = new ConfigManager();
					cm = new ConfigModel();
					// 读取配置文件,把值设置到ConfigModel中去
				}

			}
		}
		return manager;
	}

	/**
	 * 获取配置的数据
	 * 
	 * @return 配置的数据
	 */
	public ConfigModel getConfigData() {
		return cm;
	}

}

表现成代码生成:

/**
 * 生成表现层的模块
 * 
 * @author Administrator
 *
 */
public class Presentation {

	public void generate() {
		// 1:从配置管理里面获取相应的配置信息
		ConfigModel cm = ConfigManager.getInstance().getConfigData();

		if (cm.isNeedGenPresentation()) {
			// 2:按照要求生成相应的代码,并保存为文件
			System.out.println("正在生成表现成代码文件");
		}
	}

}

业务成代码生成:

public class Business {
	public void generate() {
		ConfigModel cm = ConfigManager.getInstance().getConfigData();

		if (cm.isNeedGenBusiness()) {
			System.out.println("正在生成逻辑层代码文件");
		}
	}

}

DAO层代码生成:

public class DAO {
	public void generate() {
		ConfigModel cm = ConfigManager.getInstance().getConfigData();

		if (cm.isNeedGenDAO()) {
			System.out.println("正在生成数据层代码文件");
		}
	}

}

Facade:

public class Facade {
	public void generate() {
		new Presentation().generate();
		new Business().generate();
		new DAO().generate();
	}

}

Client:

public class Client {
	public static void main(String[] args) {
		new Facade().generate();
	}

}

外观模式的优点:

  1. 松散耦合:松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。
  2. 简单易用:让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟外观交互就可以了。
  3. 更好地划分访问的层次:通过合理使用Facade,可以帮助我们更好地划分访问的层次。

外观模式的本质:封装交互,简化调用

外观模式体现的原则:最少知识原则


何时选用外观模式:

  • 如果你希望为一个复杂的子系统提供一个简单接口的时候,可以考虑使用外观模式。
  • 如果想要客户程序和抽象类的实现松散耦合,可以考虑使用外观模式。
  • 如果构建多层结构的系统,可以考虑使用外观模式。

你可能感兴趣的:(java设计模式)