设计模式之外观模式
来源:互联网 发布:网络公关服务公司 编辑:程序博客网 时间:2024/06/05 15:26
前言:
外观模式(Facade Pattern)为子系统的一组接口提供一个一致界面。定义一个高层接口,使得子系统更加容易使用。
一.外观模式简介:
外观模式体现了依赖倒转原则和迪米特法则的思想。详情如下 :
迪米特法则:如果两个类不直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类要调用另一个类中某个方法的话,可通过第三者转发这个调用。
迪米特法则强调在类结构的设计上,每一个类都应当尽量降低成员的访问权限。用Private包装不需要对外公开的字段或行为。强调类之间的松耦合,耦合度越低,就越有利于代码的复用。
依赖倒转原则: 1.高层模块不能够依赖于底层模块,两个都应该依赖于抽象。
2.抽象不能依赖于细节。细节应该依赖抽象。
外观模式就是让客户端不与系统耦合在一起,而是让外观类和客户端耦合在一起,客户端不需要知道系统的复杂度,提供了一个外界向系统的访问界面。
二.外观模式的实例讲解:
案例:“收钱吧”支付平台,提供一个统一的二维码,即可完成微信、支付宝、京东钱包等支付系统的支付功能。
注:在此只实现用户通过收钱吧付款的支付流程,商家如何通过收钱吧收款,不做讨论。
1.UML类图:
2.支付方式接口类:
package com.pattern.facade.system;/** * 支付方式的抽象接口 * @author 葫芦娃 * */public interface Pay { //提供一个可调用的接口方法 public void pay();}
3.支付方式的实现类:
①支付宝支付类:
package com.pattern.facade.system;/** * "支付宝系统 * * @author 葫芦娃 * */public class AliPay implements Pay { // 对外公开一个调用接口 @Override public void pay() { System.out.println("支付宝支付"); }}
②微信支付类:
package com.pattern.facade.system;/** * "微信支付系统 * * @author 葫芦娃 * */public class WechatPay implements Pay { // 对外公开一个调用接口 @Override public void pay() { System.out.println("微信支付"); }}
③京东钱包支付类:
package com.pattern.facade.system;/** * "京东钱包系统 * * @author 葫芦娃 * */public class JDPay implements Pay { // 对外公开一个调用接口 @Override public void pay() { System.out.println("京东钱包支付"); }}
4.外观类(收钱吧):
用收钱吧支付的时候,用户只能看到一张收钱吧的二维码,不管使用微信支付还是支付宝等,用任意支付APP扫码后都可以付款,而用户不必再根据自己的支付方式去寻找对应的二维码了。
收钱吧提供了一个用户和支付方式统一的外观,而所有的支付平台接口,只对外观类(收钱吧)公开,对用户隐藏,从而降低了而客户端与所有支付平台的耦合。
如果收钱吧引入新的支付方式,如百度钱包、QQ钱包、网银等,都不需要再大量修改客户端,只需在外观类中公开对应的支付接口即可实现业务新增。
package com.pattern.facade.facade;import com.pattern.facade.system.AliPay;import com.pattern.facade.system.JDPay;import com.pattern.facade.system.WechatPay;/** * 外观类(收钱吧统一支付类) * @author 葫芦娃 * */public class Facade { //对外界隐藏所有的支付系统,体现迪米特法则 private AliPay aliPay; private WechatPay wechatPay; private JDPay jdPay; //通过外观类的构造方法,对所有的支付方式初始化 public Facade() { super(); aliPay = new AliPay(); wechatPay = new WechatPay(); jdPay = new JDPay(); } //对外界公开所有的支付行为 public void aliPay() { aliPay.pay(); } public void wechatPay() { wechatPay.pay(); } public void jdPay() { jdPay.pay(); }}
5.客户端:
客户端通过“扫一扫”功能,获取到用户的支付方式(微信、支付宝、京东钱包等),再通过外观类,调用相应的支付平台的接口,完成付款。
package com.pattern.facade.client;import com.pattern.facade.facade.Facade;public class client { public static void main(String[] args) { //通过外观类的构造方法,已完成对所有支付方式进行初始化 Facade facade = new Facade(); //扫描二维码,获取用户使用的支付方式 int key = saoyisao(); //根据用户的支付方式,调用相应的支付系统接口 switch (key) { case 1: facade.aliPay(); break; case 2: facade.wechatPay(); break; case 3: facade.jdPay(); break; default: break; } } //扫一扫方法,扫描二维码,返回用户使用的支付方式 private static int saoyisao() { //生成1-3之间的随机数,模拟用户用不同平台支付 return (int)(Math.random()*3+1); }}
6.运行结果(随机):
微信支付
三.总结:
1.在程序设计初期,可以用外观模式将不同行为的层分离,比如常见的MVC模式,将模型层、视图层、控制层分离,层与层之间建立一个外观,为复杂的子系统提供一个简单的接口,降低耦合度。
2.系统的重构迭代会使其变得越来越复杂,外部程序在调用的时候难度也就增大了,这时通过外观模式,提供一个简单的调用接口,减少了系统之间的依赖。
3.在维护一个大型老系统时候,可能在其身上做扩展已经很难了,但它的很多功能新需求必须要用到,这时候可以为新需求开发一个外观类,外观类负责与老系统的重要功能交互,新系统只需要跟外观类交互,调用相应的接口即可。
- 设计模式之外观
- 设计模式之外观
- 设计模式 之 外观
- 设计模式之外观
- 设计模式之外观模式
- 设计模式之外观模式
- 设计模式之外观模式
- 设计模式之外观模式
- 设计模式之外观模式
- 设计模式之外观模式
- 设计模式之外观模式
- 设计模式之外观模式
- 设计模式之外观模式
- 设计模式之外观模式
- 设计模式之外观模式
- 设计模式之外观模式
- 设计模式之外观模式
- 设计模式之外观模式
- Hell on the Markets UVA
- 启动hive web访问服务时,出现.....hwi.war找不到
- PHP设计模式(三),工厂方法模式
- 爬虫基础1--Request
- python获取IP
- 设计模式之外观模式
- hdu2582 f(n) 找规律 素数筛
- 移动端头部文件详解(二)
- winform项目的app.config和exe.config文件
- smart_ptr智能指针的简单实现
- 一起来读Greenplum/Deepgreen执行计划
- lvs+keepalived高可用
- JNI 方法
- 站内信表结构设计