设计模式课程 设计模式精讲 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 ...
随机推荐
- spark streaming读取kakfka数据手动维护offset
在spark streaming读取kafka的数据中,spark streaming提供了两个接口读取kafka中的数据,分别是KafkaUtils.createDstream,KafkaUtils ...
- dp(装箱)
请小伙伴们对自己AC的题目进行标记,注意每人只能标记一次!不知道的不要标记,恶意标记者将回收账号!!! 问题 B: 装箱问题 时间限制: 1 Sec 内存限制: 128 MB[提交] [状态] 题目 ...
- codeforces Beautiful Numbers
来源:http://codeforces.com/problemset/problem/1265/B B. Beautiful Numbers You are given a permutat ...
- B站上线互动视频背后,是一场谁都输不起的未来之战
毋庸置疑的是,视频网站的竞争已愈发激烈.而它们的竞争体现在多个维度,比如买视频会员赠送购物网站会员.依靠各自的社交体系不断尝试打破圈层瓶颈等.当然,最直接的竞争还是体现在内容层面.购买独家版权.制作原 ...
- C语言:对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中。-在数组中找出最小值,并与第一个元素交换位置。
//对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中. #include <stdio.h& ...
- 1、MyBatis框架底层初涉
1.拜年 哈哈,现在是过年了,祝大家新年好. 本来大过年的是不打算碰电脑的,(抢票除外,三疯同学现在还没抢到票,然后突然又延长假期了).现在疫情严重,被堵家里不能出去了.不能为国家做贡献,但是起码不能 ...
- mysql取出字段数据的精度
$field = 'convert(avg(mood),decimal(4,0)) mood,convert(avg(hrv),decimal(4,0)) hrv,convert(avg(heart_ ...
- 例题3_1 TeX中的引号(TeX Quotes,UVa 272)
在TeX中,左双引号是“``”,右双引号是“''”.输入一篇包含双引号的文章,你的任务是把它转换成TeX的格式. 样例输入: "To be or not to be,"quoth ...
- 【代码学习】PYTHON 异常处理
一.什么是异常 在程序执行过程中可能会影响程序的正常执行,一般情况下,在python无法正常处理程序时就会发生一个异常 当python脚本发生异常时我们需要捕获处理他,否则程序会终止执行 二.异常处理 ...
- ZOJ1006 Do the Untwist
简单模拟~ #include<bits/stdc++.h> using namespace std; ; int a[maxn]; unordered_map<char,int> ...