1    代码演练

1.1  代码演练1(不使用外观模式)

1.2  代码演练2(使用外观模式)

2    应用核心

2.1  核心

2.2  零碎知识点

1    代码演练
1.1  代码演练1(不使用外观模式)

需求:

木木网有积分兑换礼物的功能,设计的时候需要校验三步:

a  资格校验系统,是木木网会员。

b  积分系统,该系统放的是各个积分的获取支出,需要拿出该用户目前的积分和该礼物所需要的积分进行对比

c  物流系统,如果满足ab,则返回成功,并返回一个订单号。

关注点:

应用层无需知道资格校验类等其他子系统的类

UML类图:

测试类:

package com.geely.design.pattern.structural.facade;

/**
* 测试外观模式
*/
public class Test {
public static void main(String [] args){
GiftExchangeService giftExchangeService = new GiftExchangeService();
PointGift pointGift = new PointGift("熊猫抱枕");
/**
* 下边要注入三个子系统,我私下认为这种方式很不常规,测试类我只需要知道交互的类就可以了
* 也就是说,我只需要知道giftExchange即可
*/
giftExchangeService.setQualifyService(new QualifyService());
giftExchangeService.setPointPaymentService(new PointPaymentService());
giftExchangeService.setShippingService(new
ShippingService());
giftExchangeService.giftExchange(pointGift);
}
}

外观类:

package com.geely.design.pattern.structural.facade;

/**
* 外观类
*/
public class GiftExchangeService {
private QualifyService qualifyService;
private PointPaymentService pointPaymentService;
private ShippingService shippingService; /**
* 初始化的时候把这些服务类进行注入
* @param qualifyService
*/
public void setQualifyService(QualifyService qualifyService) {
this.qualifyService = qualifyService;
} public void setPointPaymentService(PointPaymentService pointPaymentService) {
this.pointPaymentService = pointPaymentService;
} public void setShippingService(ShippingService shippingService) {
this.shippingService = shippingService;
} public void giftExchange(PointGift pointGift){
if(qualifyService.getQualify(pointGift)){
//如果资格通过,校验积分是否通过,积分通过,会进行发货交易
if(pointPaymentService.pay(pointGift)){
shippingService.shipGift(pointGift);
}
} }
}

资格验证系统类:

package com.geely.design.pattern.structural.facade;

/**
* 资格校验类
*/
public class QualifyService {
/**
* 获取是否得到校验资格
* @param pointGift
* @return
*/
public boolean getQualify(PointGift pointGift){
//判断是否木木网会员类逻辑
System.out.println(pointGift.getGiftName()+"资格校验通过!");
return true;
} }

积分系统类:

package com.geely.design.pattern.structural.facade;

/**
* 积分校验类,校验积分是否足够
*/
public class PointPaymentService { public boolean pay(PointGift pointGift){
System.out.println(pointGift.getGiftName()+"积分校验通过!");
return true;
}
}

物流系统类:

package com.geely.design.pattern.structural.facade;

/**
* 物流子系统
*/
public class ShippingService {
public String shipGift(PointGift pointGift){
//其他校验逻辑
String orderNo = "999";
System.out.println(pointGift.getGiftName()+"发送物流成功,订单号为"+orderNo);
return orderNo;
}
}

实体类:

package com.geely.design.pattern.structural.facade;

/**
* 礼物积分类,作为基类存在,其他服务类调取本类
*/
public class PointGift {
/**
* 通过构造器声明积分礼物,方便Test类进行测试
* @param giftName
*/
public PointGift(String giftName) {
this.giftName = giftName;
} private String giftName;//礼物名称 public String getGiftName() {
return giftName;
} public void setGiftName(String giftName) {
this.giftName = giftName;
}
}

打印结果:

"C:\Program Files\Java\jdk1.7.0_79\bin\java.exe" "-javaagent:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar=19215:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_79\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\rt.jar;F:\xiangmu3\Xin\Idea\design_pattern\target\classes" com.geely.design.pattern.structural.facade.Test
熊猫抱枕资格校验通过!
熊猫抱枕积分校验通过!
熊猫抱枕发送物流成功,订单号为999 Process finished with exit code 0
1.2  代码演练2(使用外观模式)

测试类:

package com.geely.design.pattern.structural.facade;

/**
* 测试外观模式
*/
public class Test {
public static void main(String [] args){
GiftExchangeService giftExchangeService = new GiftExchangeService();
PointGift pointGift = new PointGift("熊猫抱枕");
/**
* 下边要注入三个子系统,我私下认为这种方式很不常规,测试类我只需要知道交互的类就可以了
* 也就是说,我只需要知道giftExchange即可
*/
/* giftExchangeService.setQualifyService(new QualifyService());
giftExchangeService.setPointPaymentService(new PointPaymentService());
giftExchangeService.setShippingService(new ShippingService());*/
giftExchangeService.giftExchange(pointGift);
}
}

外观类:

package com.geely.design.pattern.structural.facade;

/**
* 外观类
*/
public class GiftExchangeService {
private QualifyService qualifyService = new QualifyService();
private PointPaymentService pointPaymentService = new PointPaymentService();
private ShippingService shippingService = new ShippingService();
/**
* 初始化的时候把这些服务类进行注入
* @param qualifyService
*/
/*public void setQualifyService(QualifyService qualifyService) {
this.qualifyService = qualifyService;
} public void setPointPaymentService(PointPaymentService pointPaymentService) {
this.pointPaymentService = pointPaymentService;
} public void setShippingService(ShippingService shippingService) {
this.shippingService = shippingService;
}*/ public void giftExchange(PointGift pointGift){
if(qualifyService.getQualify(pointGift)){
//如果资格通过,校验积分是否通过,积分通过,会进行发货交易
if(pointPaymentService.pay(pointGift)){
shippingService.shipGift(pointGift);
}
} }
}
2    应用核心
2.1  核心

应用层不关心子系统,应用层只和外观类通信,子系统只和外观类通信。

2.2  零碎知识点

因为没有集成Spring框架,所以使用set方法注入

1.2案例假设初始化的时候服务的类都是创建好的。

如果继续增加子系统的话,使用实体外观类的话,不符合开闭原则,如果使用抽象外观类或者外观接口的话,符合开闭原则。

设计模式课程 设计模式精讲 10-2 外观模式coding的更多相关文章

  1. 设计模式课程 设计模式精讲 13-2 享元模式coding

    1 代码演练 1.1 代码演练1 1 代码演练 1.1 代码演练1 需求: 每周由随机部门经历做报告: 重点关注: a 该案例是单例模式和享元模式共同使用 b 外部传入的department是外部状态 ...

  2. 设计模式课程 设计模式精讲 11-2 装饰者模式coding

    1 代码演练 1.1 代码演练1(未使用装饰者模式) 1.2 代码演练2(使用装饰者模式) 1 代码演练 1.1 代码演练1(未使用装饰者模式) 需求: 大妈下班卖煎饼,加一个鸡蛋加一元,一个火腿两元 ...

  3. 第10章 外观模式(Façade Pattern)

    原文   第10章 外观模式(Façade Pattern) 概述:   在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化.那么如何简化客户程序 ...

  4. 设计模式课程 设计模式精讲 7-2 建造者模式Coding

    1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作 ...

  5. 设计模式课程 设计模式精讲 17-2 模板方法模式coding

    1 代码演练 1.1 代码演练1 1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法) 1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?) 1 代码演练 1.1 ...

  6. 设计模式(10)--Facade(外观模式)--结构型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使 ...

  7. (转载)设计模式学习笔记(十一)——Facade外观模式

    (转载)http://www.cnblogs.com/kid-li/archive/2006/07/10/446904.html Facade外观模式,是一种结构型模式,它主要解决的问题是:组件的客户 ...

  8. 设计模式(八): 从“小弟”中来类比"外观模式"(Facade Pattern)

    在此先容我拿“小弟”这个词来扯一下淡.什么是小弟呢,所谓小弟就是可以帮你做一些琐碎的事情,在此我们就拿“小弟”来类比“外观模式”.在上面一篇博文我们完整的介绍了“适配器模式”,接下来我们将要在这篇博客 ...

  9. 研磨设计模式解析及python代码实现——(二)外观模式(Facade)

    一.外观模式定义 为子系统中的一组接口提供一个一致的界面,使得此子系统更加容易使用. 二.书中python代码实现 class AModuleApi: def testA(self): pass cl ...

随机推荐

  1. 《实战Java高并发程序设计》读书笔记四

    第四章 锁的优化及注意事项 1.锁性能的几点建议 减小锁持有时间: 系统持有锁时间越长锁竞争程度就越激烈,只对需要同步的方法加锁,可以减小锁持有时间进而提高锁性能. 减少锁的持有时间有助于降低锁冲突的 ...

  2. php substr的一些用法

    //去掉最后一个字符$str = "1,2,3,4,5,6,"; $newstr = substr($str,0,strlen($str)-1); echo $newstr; ub ...

  3. mongodb 用户指引

    维护人:陈权 一.mongodb install on linuxcurl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6 ...

  4. Unix套接字接口

    简介 套接字是操作系统中用于网络通信的重要结构,它是建立在网络体系结构的传输层,用于主机之间数据的发送和接收,像web中使用的http协议便是建立在socket之上的.这一节主要讨论网络套接字. 套接 ...

  5. mybatis Plus 多表联合查询

    //实体类package com.sk.skkill.entity; import com.baomidou.mybatisplus.annotation.TableField;import com. ...

  6. ES6:字面量的增强写法

    以前对象字面量的写法: 属性的增强写法: ES6中可以写成: 方法的增强写法 ES6中可以写成: ~~~~~ END ~~~~~

  7. WLC3504 HA配置

    1.WLC3504 HA连接方式 2.说明 WLC3504可以支持HA,AP SSO和Client SSO. 也是通过RP端口去连接,从active到standby-hot设备同步设备配置包括mana ...

  8. Nexus-VDC(Virtual Device Context)

    VDC实际上是将一台物理的Nexus7K设备虚拟为多个逻辑的VDC设备,该术语叫做VDC(Virtual Device Context),该虚拟技术实际上是在一个物理设备架构和内核上运行多个VDC,已 ...

  9. C++ STL之unordered_map和unordered_set的使⽤

    写在最前面,本文摘录于柳神笔记: unordered_map 在头⽂件 #include <unordered_map> 中, unordered_set 在头⽂件 #include &l ...

  10. pycharm中Terminal中运行用例

     1.设置终端路径 2.单个用例文件运行 3.多个用例文件,例如加载用例的文件运行 1.可能会出现如下错误(参考:https://blog.csdn.net/qq_36829091/article/d ...