设计模式之外观模式

来源:互联网 发布:网络公关服务公司 编辑:程序博客网 时间: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.在维护一个大型老系统时候,可能在其身上做扩展已经很难了,但它的很多功能新需求必须要用到,这时候可以为新需求开发一个外观类,外观类负责与老系统的重要功能交互,新系统只需要跟外观类交互,调用相应的接口即可。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 订单中快递单号填错了怎么办 高考动态口令卡页面找不到了怎么办 支付宝收钱码被别人扫了怎么办 上高速收费下高速免费卡怎么办 微信聊天记录导出来了是乱码怎么办 电脑用优盘打开文件夹是空的怎么办 快压解压文件在电脑上打不开怎么办 虎牙直播刺激战场观看有延迟怎么办 登录页面点击登录窗口关不了怎么办 h5中的摇晃手机在电脑端怎么办 忘记手机锁屏密码怎么办4g qq最早绑定的号码忘记了怎么办 重启路由器之后宽带连接不上怎么办 微信授权小程序总是不行怎么办 微信把钱转到别人账户里了怎么办 微信转到对方账户停用了怎么办 微信号被认为是投票水军怎么办 微信投票时显示账号异常怎么办 京东商城买东西老不到货怎么办 优酷投屏一会就会出现花报怎么办 苹果手机的app安卓找不到怎么办 微信网页获取用户信息点了否怎么办 淘宝卖家退发货信息选择错了怎么办 法宣在线出现在其他地方登陆怎么办 QQ被冻结又不知道申诉资料怎么办 开通优酷会员了再开酷喵会员怎么办 考的不好时别人问你多少分时怎么办 订了产品一直收不到货怎么办 微信零钱提现忘记密码怎么办 微信里面的零钱忘记密码怎么办 微信的零钱密码丢了怎么办 微信公众号被屏蔽了所有功能怎么办 刚开淘宝店没信誉要怎么办 如果发现货品有问题商家不换怎么办 文件夹里面的图片怎么拖不动怎么办 网赌系统维护审核就不给提款怎么办 客户说我卖的东西是假货怎么办 微信小程序第三方平台倒闭了怎么办 金立手机锁屏密码忘了怎么办 不知道微信账号的公众号密码怎么办 微信公众号充话费充错号码怎么办