设计模式---设计模式之外观模式
第一:场景模拟
比如说我要买电脑
第一种办法就是,完全靠自己,自己去买配件,然后自己组装。这个办法要求自己对配件比较熟悉。
第二种办法就是,找一家专业的装机公司,提出自己的要求, 然后等着拿电脑就行了。
很明显,第二种办法虽然多花钱,可是客户不需要了解那么多。
通过这个场景,我们可以将第二种办法抽象为如下图,也就是我们的外观模式。
第二:问题由来
示例代码如下
[java] www.zzzyk.com
package demo02.facade;
/**
* 示意配置描述的数据Model,真实的配置数据会很多
*/
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;
}
}
[java]
package demo02.facade;
/**
* 示意配置管理,就是负责读取配置文件, 并把配置文件的内容设置到配置Model中去,是个单例
*/
public class ConfigManager {
private static ConfigManager manager = null;
private static ConfigModel cm = null;
private ConfigManager() {
}
public static ConfigManager getInstance() {
if (manager == null) {
manager = new ConfigManager();
cm = new ConfigModel();
// 读取配置文件,把值设置到ConfigModel中去
}
return manager;
}
/**
* 获取配置的数据
*
* @return 配置的数据
*/
public ConfigModel getConfigData() {
return cm;
}
}
[java]
package demo02.facade;
/**
* 示意生成表现层的模块
*/
public class Presentation {
public void generate() {
// 1:从配置管理里面获取相应的配置信息
ConfigModel cm = ConfigManager.getInstance().getConfigData();
if (cm.isNeedGenPresentation()) {
// 2:按照要求去生成相应的代码,并保存成文件
System.out.println("正在生成表现层代码文件");
}
}
}
[java]
package demo02.facade;
/**
* 示意生成逻辑层的模块
*/
public class Business {
public void generate() {
// 1:从配置管理里面获取相应的配置信息
ConfigModel cm = ConfigManager.getInstance().getConfigData();
if (cm.isNeedGenBusiness()) {
// 2:按照要求去生成相应的代码,并保存成文件
System.out.println("正在生成逻辑层代码文件");
}
}
}
[java] view plaincopyprint?
package demo02.facade;
/**
* 示意生成数据层的模块
*/
public class DAO {
public void generate() {
// 1:从配置管理里面获取相应的配置信息
ConfigModel cm = ConfigManager.getInstance().getConfigData();
if (cm.isNeedGenDAO()) {
// 2:按照要求去生成相应的代码,并保存成文件
System.out.println("正在生成数据层代码文件");
}
}
}
[java]
package demo02.facade;
public class Client {
public static void main(String[] args) {
// 现在没有配置文件,就直接使用默认的配置
// 通常情况下,三层都应该生成,也就是说客户端必须
// 对这些模块都有了解,才能够正确使用它们
new Presentation().generate();
new Business().generate();
new DAO().generate();
}
}
通常情况下,三层都应该生成,也就是说客户端必须对这些模块都有了解,才能够正确使用它们,这无疑是个易做图烦,因为客户端不能简单的使用代码,如果某个功能模块发生了变化,还要引起客户端发生变化。
第三:解决办法
这里就需要我们的装机公司了,也就是今天的主题,外观模式。
外观模式定义:为子系统的一组接口提供一个一致的界面,Façade模式定了一个高层接口,这个接口使得子系统更加容易使用。如下图
举一个
补充:软件开发 , Java ,