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. spark streaming读取kakfka数据手动维护offset

    在spark streaming读取kafka的数据中,spark streaming提供了两个接口读取kafka中的数据,分别是KafkaUtils.createDstream,KafkaUtils ...

  2. dp(装箱)

    请小伙伴们对自己AC的题目进行标记,注意每人只能标记一次!不知道的不要标记,恶意标记者将回收账号!!! 问题 B: 装箱问题 时间限制: 1 Sec  内存限制: 128 MB[提交] [状态] 题目 ...

  3. codeforces Beautiful Numbers

    来源:http://codeforces.com/problemset/problem/1265/B   B. Beautiful Numbers   You are given a permutat ...

  4. B站上线互动视频背后,是一场谁都输不起的未来之战

    毋庸置疑的是,视频网站的竞争已愈发激烈.而它们的竞争体现在多个维度,比如买视频会员赠送购物网站会员.依靠各自的社交体系不断尝试打破圈层瓶颈等.当然,最直接的竞争还是体现在内容层面.购买独家版权.制作原 ...

  5. C语言:对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中。-在数组中找出最小值,并与第一个元素交换位置。

    //对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中. #include <stdio.h& ...

  6. 1、MyBatis框架底层初涉

    1.拜年 哈哈,现在是过年了,祝大家新年好. 本来大过年的是不打算碰电脑的,(抢票除外,三疯同学现在还没抢到票,然后突然又延长假期了).现在疫情严重,被堵家里不能出去了.不能为国家做贡献,但是起码不能 ...

  7. mysql取出字段数据的精度

    $field = 'convert(avg(mood),decimal(4,0)) mood,convert(avg(hrv),decimal(4,0)) hrv,convert(avg(heart_ ...

  8. 例题3_1 TeX中的引号(TeX Quotes,UVa 272)

    在TeX中,左双引号是“``”,右双引号是“''”.输入一篇包含双引号的文章,你的任务是把它转换成TeX的格式. 样例输入: "To be or not to be,"quoth ...

  9. 【代码学习】PYTHON 异常处理

    一.什么是异常 在程序执行过程中可能会影响程序的正常执行,一般情况下,在python无法正常处理程序时就会发生一个异常 当python脚本发生异常时我们需要捕获处理他,否则程序会终止执行 二.异常处理 ...

  10. ZOJ1006 Do the Untwist

    简单模拟~ #include<bits/stdc++.h> using namespace std; ; int a[maxn]; unordered_map<char,int> ...