外观模式本质:
封装交互,简化调用
demo:下面使用外观模式写一个简单的代码生成器
将要创建的类:
ConfigModel:配置描述的数据model
ConfigManager:配置管理
Presentation:表现层的模块
Business:逻辑层的代码
Dao:数据层的模块
Facade:组装模块
Client:消费者
@Data
public class ConfigModel {
/**
* 是否需要生成表现成,默认是true
*/
private boolean needGenPresentation = true;
/**
* 是否需要生成逻辑层,默认是true
*/
private boolean needGenBusiness = true;
/**
* 是否需要生成Dao,默认是true
*/
private boolean needGenDao = true;
}
public class ConfigManager {
private static ConfigManager manager = null;
private static ConfigModel cm = null;
public ConfigManager() {
}
public static ConfigManager getInstance(){
if(manager == null){
manager = new ConfigManager();
cm = new ConfigModel();
// 读取配置文件, 把值设置到ConfigModel中去,这里省略
}
return manager;
}
/**
* 获取配置的数据
* @return
*/
public ConfigModel getConfigData(){
return cm;
}
}
public class Presentation {
public void generate(){
// 从配置管理里面获取相应的配置信息
ConfigModel cm = ConfigManager.getInstance().getConfigData();
if(cm.isNeedGenPresentation()){
// 按照要求去生成对应的代码,并保存成文件
System.out.println("正在生成表现层代码文件");
}
}
}
public class Business {
public void generate(){
ConfigModel cm = ConfigManager.getInstance().getConfigData();
if(cm.isNeedGenBusiness()){
System.out.println("生成逻辑层代码文件");
}
}
}
public class Dao {
public void generate(){
ConfigModel cm = ConfigManager.getInstance().getConfigData();
if(cm.isNeedGenDao()){
System.out.println("生成数据库层代码文件");
}
}
}
public class Facade {
public void generate(){
new Presentation().generate();
new Business().generate();
new Dao().generate();
}
}
public class Client {
public static void main(String[] args) {
new Facade().generate();
}
}
外观模式的优点:
松散耦合
简单易用
更好地划分访问的层次
外观模式的缺点:
过多的或者不太合理的Facade容易让人迷惑,到底是调用Facade还是直接调用方法本身呢。
何时选择外观模式:
1、如果你希望为一个复杂的子系统提供一个简单接口的时候,可以考虑使用外观模式。
2、如果想要让客户程序和抽象类的实现部分松散耦合,可以考虑使用外观模式。
3、如果构建多层结构的系统,可以考虑使用外观模式。