设计模式课程 设计模式精讲 10-2 外观模式coding
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的更多相关文章
- 设计模式课程 设计模式精讲 13-2 享元模式coding
1 代码演练 1.1 代码演练1 1 代码演练 1.1 代码演练1 需求: 每周由随机部门经历做报告: 重点关注: a 该案例是单例模式和享元模式共同使用 b 外部传入的department是外部状态 ...
- 设计模式课程 设计模式精讲 11-2 装饰者模式coding
1 代码演练 1.1 代码演练1(未使用装饰者模式) 1.2 代码演练2(使用装饰者模式) 1 代码演练 1.1 代码演练1(未使用装饰者模式) 需求: 大妈下班卖煎饼,加一个鸡蛋加一元,一个火腿两元 ...
- 第10章 外观模式(Façade Pattern)
原文 第10章 外观模式(Façade Pattern) 概述: 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化.那么如何简化客户程序 ...
- 设计模式课程 设计模式精讲 7-2 建造者模式Coding
1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作 ...
- 设计模式课程 设计模式精讲 17-2 模板方法模式coding
1 代码演练 1.1 代码演练1 1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法) 1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?) 1 代码演练 1.1 ...
- 设计模式(10)--Facade(外观模式)--结构型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使 ...
- (转载)设计模式学习笔记(十一)——Facade外观模式
(转载)http://www.cnblogs.com/kid-li/archive/2006/07/10/446904.html Facade外观模式,是一种结构型模式,它主要解决的问题是:组件的客户 ...
- 设计模式(八): 从“小弟”中来类比"外观模式"(Facade Pattern)
在此先容我拿“小弟”这个词来扯一下淡.什么是小弟呢,所谓小弟就是可以帮你做一些琐碎的事情,在此我们就拿“小弟”来类比“外观模式”.在上面一篇博文我们完整的介绍了“适配器模式”,接下来我们将要在这篇博客 ...
- 研磨设计模式解析及python代码实现——(二)外观模式(Facade)
一.外观模式定义 为子系统中的一组接口提供一个一致的界面,使得此子系统更加容易使用. 二.书中python代码实现 class AModuleApi: def testA(self): pass cl ...
随机推荐
- Go 语言 fmt.Sprintf (格式化输出)
Printf().Sprintf().Fprintf() 函数的区别用法是什么? 都是输出格式化字符串,只是输出到的目标不一样: Printf() 是把格式化字符串输出到标准到标准输出(一般是屏幕,可 ...
- [转] C++ CImage实现的全屏PNG截图
#include <atlimage.h> #include <atltime.h> #include <conio.h> //截取全屏保存为png CString ...
- 谈谈一些有趣的CSS题目-- 单行居中,两行居左,超过两行省略
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- yii2.0 构造函数
public function init() { parent:: init(); }
- rsync+inotify实现主机之间目录实时同步
原理: rsync:用于跨主机目录同步 inotify:用于监测目录变化 再编写一个触发脚本,一旦inotify检测到目录中内容发生变化,则调用rsync执行同步. rsync服务器的的配置: 因为r ...
- cnpm - 解决 " cnpm : 无法加载文件 C:\Users\93457\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息 。。。 "
1.在win10 系统中搜索框 输入 Windos PowerShell选择 管理员身份运行 2,打开了powershell命令行之后,输入 set-ExecutionPolicy RemoteSig ...
- 计算机二级-C语言-程序填空题-190115记录-fprintf()函数和fscanf()函数的使用。
//给定程序,函数fun的功能是:将自然数1~10以及它们的平方根写到名为myflie3.txt的文本文件中,然后再顺序读出显示在屏幕上. //重难点:fprintf()函数和fscanf()函数的使 ...
- ASP.NET Core搭建多层网站架构【8.3-编写角色业务的增删改】
2020/01/29, ASP.NET Core 3.1, VS2019 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[8.3-编写角色业务的增删改] 编写最简单的增删 ...
- java并发基础知识
这几天全国都是关键时候,放假了,还是要学习啊!很久没有写博客了,最近看了一本书,有关于java并发编程的,书名叫做“java并发编程之美”,讲的很有意思,这里就做一个笔记吧! 有需要openjdk8源 ...
- python写入文件中遇到 UnicodeEncodeError: ‘gbk’ codec can’t encode character 错误的解决办法
在写入TXT文件时,某些页面总是报UnicodeEncodeError: ‘gbk’ codec can’t encode character错误,网上找了半天也没找到解决办法. 后来终于找到了解决办 ...