设计模式课程 设计模式精讲 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 ...
随机推荐
- 文本编辑器EditPlus的安装
- C语言程序设计(二)
目录: 1.算法基本概念 2.认识循环语句 3.算法的表示法 4.求素数 5.求闰年 6.判断一个数是否为回文数 算法基本概念: (一)一个程序主要包含的2方面信息: 1.对数据的描述,在程序中要 ...
- 2.1.FastDFS-单机拆分版-调度器安装配置
Centos610系列配置 我们在Centos610FastDFS单机模式-FastDFS安装 中已经完成了FastDFS的安装,接下来我们进行FastDFS调度器的安装. 1.找到FastDFS配置 ...
- 动态规划: 最大m子段和问题的详细解题思路(JAVA实现)
这道最大m子段问题我是在课本<计算机算法分析与设计>上看到,课本也给出了相应的算法,也有解这题的算法的逻辑.但是,看完之后,我知道这样做可以解出正确答案,但是我如何能想到要这样做呢? 课本 ...
- python基础(二)---第一个程序
1. 第一个程序 1.1 Hello Python书写步骤 步骤一:新建文本文档文件,修改名称为hello.py 步骤二:使用记事本打开文件,书写程序内容如下: 步骤三:打开命令行,输入执行指令:py ...
- 一个包含arctan与arctanh的积分
\[\Large\int_0^1\frac{\arctan x \,\operatorname{arctanh} x\, \ln x}{x}\mathrm{d}x=\frac{\pi^2}{16}\m ...
- spring boot加载配置文件的顺序
四个默认加载配置文件地方的优先级,四个文件相同配置有优先级概念 不同位置相互补充 外部配置文件不建议使用,不符合maven项目结构,打包会打不进去
- 开源代码License
参考:https://mp.weixin.qq.com/s/Q29NGDIbyCwm6KiAKqI46A
- 【原】python3.6安装python-dev
[root@ci /usr/lib64/python3.6]# yum -y install python36-devel
- php的注释、变量、类型、常量、运算符、比较符、条件语句;
php的注释 1.// 2.# 3./* */ 变量 变量是储存信息的容器: 变量规则: 1.变量以$开头,后面跟名称>>>$sum; 2.变量必须以字母或下滑先开头,不能用数字开 ...