23种设计模式-java-外观模式

模式概述:

能为程序库、 框架或其他复杂类提供一个简单的接口。要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。提供一个高层次的接口,使得子系统更易于使用。

使用场景:

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());
    }
}

测试结果:
在这里插入图片描述

外观模式与中介者模式对比

外观模式属于结构型设计模式,中介者模式属于行为模式;外观模式是对外(对子系统设置一个门面对外提供服务),中介者模式是对内(子系统内各个类之间相互交互,关系复杂,设置一个中介者,类之间的交互都必须通过中介者)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值