模式概述:
能为程序库、 框架或其他复杂类提供一个简单的接口。要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。提供一个高层次的接口,使得子系统更易于使用。
使用场景:
1.如果你需要一个指向复杂子系统的直接接口, 且该接口的功能有限, 则可以使用外观模式。
2. 如果需要将子系统组织为多层结构, 可以使用外观。
代码样例:
代码背景: 一个幼儿培训班营销模块进行生成营销策略,具体的营销策略生成是根据child的电话号码查询用户关系表得到child的身份证号,然后根据身份证号查询child的详细信息,得到其father的身份证号,然后校验father是不是营销的红黑名单,校验结果是目标用户后,获取father的详细信息,得到father的薪资信息后,根据薪资等级推荐不同的产品。本身的营销策略的生成比较复杂,所以不在客户端直接使用这套子系统,而是新增一个外观(门面),把子系统中生成营销策略的逻辑抽到外观类中,外观类对外提供一个简单的接口(高层次的接口),客户端只需要调用外观类的简单方法即可。
public class UserRel {
/**
* 根据用户号码查询用户身份证号
*/
public int getIdCard(String ServiceNbr){
return 123;
}
}
public class UserInfo {
/**
* 获取用户详情数据
*/
public Map<String,Object> getUserInfo(int idCard){
Map<String,Object> userInfo = new HashMap<>();
userInfo.put("fatherIdCard",234);
userInfo.put("salary",10000);
userInfo.put("serviceNbr",10086);
return userInfo;
}
}
/**
* 敏感客户校验
*/
public class SensitiveService {
public boolean check(int idCard){
boolean result = false;
if(idCard==1){
System.out.println(idCard+"为红名单用户");
result = true;
}else if(idCard==2){
System.out.println(idCard+"为黑名单用户");
result = true;
}
return result;
}
}
/**
* 营销策略
*/
public class Strategy {
public Map<String,Object> strategy(Map<String,Object> userInfo){
Map<String,Object> strategyMap = new HashMap<>();
strategyMap.put("serviceNbr",userInfo.get("serviceNbr"));
if((int)userInfo.get("salary")>20000){
strategyMap.put("product","终极套餐");
}else if((int)userInfo.get("salary")>10000){
strategyMap.put("product","卓越套餐");
}else if((int)userInfo.get("salary")>50000){
strategyMap.put("product","黄金套餐");
}else{
strategyMap.put("product","普通套餐");
}
return strategyMap;
}
}
/**
* 外观
*/
public class Facade {
private UserRel userRel = new UserRel();
private UserInfo userInfo = new UserInfo();
private SensitiveService sensitiveService = new SensitiveService();
private Strategy strategy = new Strategy();
public Map<String,Object> sell(String serviceNbr){
int childIdCard = userRel.getIdCard(serviceNbr);
Map<String,Object> childInfo = userInfo.getUserInfo(childIdCard);
if(sensitiveService.check((int)childInfo.get("fatherIdCard"))) {//敏感用户(红黑名单不可营销)
return new HashMap();
}else{
Map<String,Object> parentInfo = userInfo.getUserInfo((int)childInfo.get("fatherIdCard"));
return strategy.strategy(parentInfo);
}
}
}
public class TestFacade {
public static void main(String[] args) {
Map<String,Object> sellStrategy = new Facade().sell("10001");
System.out.println(sellStrategy.toString());
}
}
测试结果:
外观模式与中介者模式对比
外观模式属于结构型设计模式,中介者模式属于行为模式;外观模式是对外(对子系统设置一个门面对外提供服务),中介者模式是对内(子系统内各个类之间相互交互,关系复杂,设置一个中介者,类之间的交互都必须通过中介者)