浅谈Facade外观模式

一、 基本概念

有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝里就有许多的基金,它将投资者分散的资金集中起来,交由专业的经理人进行管理,投资于股票、债券、外汇等领域,而基金投资的收益归持有者所有,管理机构收取一定比例的托管管理费用。

  其实本篇要说的这个设计模式就和这很有关系,由于当投资者自己买股票时,由于众多投资者对众多股票的联系太多,反而不利于操作,这在软件中就成为耦合性太高,而有了基金后,就变成众多用户只和基金打交道,关心基金的上涨和下跌,而实际上的操作确是基金经理人与股票和其它投资产品打交道,这就是外观模式。

  外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。UML结构图如下:

1018770-20180516215807111-1163114845.png

其中Facade是外观角色,也叫门面角色,客户端可以调用这个角色的方法,此角色知晓子系统的所有功能和责任,将客户端的请求代理给适当的子系统对象;Subsystem是子系统角色,可以同时拥有一个或多个子系统,每一个子系统都不是一个单独的类,而是一个类的集合,子系统并不知道门面的存在。

1、外观类

这里我给出了2个Subsystem子系统,分别为A、B。

package designMode.facade2;

public class Facade {
    //被委托的对象
    SubSystemA a;
    SubSystemB b;

    public Facade() {
        a = new SubSystemA();
        b = new SubSystemB();
    }

    //提供给外部访问的方法
    public void methodA() {
        this.a.dosomethingA();
    }

    public void methodB() {
        this.b.dosomethingB();
    }
}

2、subsystem子系统角色

这里为了不过多赘述,只放上A的代码,其余子系统类似。

package designMode.facade2;

public class SubSystemA {
    public void dosomethingA() {
        System.out.println("子系统方法A");
    }
}
package designMode.facade2;

public class SubSystemB {
    public void dosomethingB() {
        System.out.println("子系统方法B");
    }
}

3、client客户端

package designMode.facade2;

public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.methodA();
        facade.methodB();
    }
}

4、运行结果:

up-68f9b51d1062617adffd7600cc30eaf2d24.png

二、外观模式的应用

1、应用场景

(1)客户端不需要知道内部的复杂联系,整个系统只提供一个“接待员”即可

(2)定义系统的入口

2、方法

客户端不与系统耦合,外观类与系统耦合

3、优点

(1)减少了系统的相互依赖

(2)提高了灵活性,不管系统内部如何变化,只要不影响到外观对象,任你自由活动

(3)提高了安全性,想让你访问什么你就只能访问什么

4、缺点

修改麻烦

5、使用场景

(1)为一个复杂的模块或子系统提供一个外界访问的接口

(2)子系统相对独立,外界对子系统的访问只要黑箱操作即可

(3)预防低水平人员带来的风险扩散

6、应用实例

基金(用户只和基金打交道,实际操作为基金经理人与股票和其它投资品打交道)

三、外观模式的实现

我们就以开篇说的基金为例,来编写一下代码,熟悉外观模式的使用。UML图如下:

1018770-20180516222046525-864875223.png

1、基金类(Fund)

基金类,基金经理人通过该类作为中间交互者,可以接受投资者的资金,统一对股票、国债、房地产进行购买和赎回操作。

package designMode.facade2;

public class Fund {
    Stock1 stock1;
    Stock2 stock2;
    Stock3 stock3;

    public Fund() {
        stock1 = new Stock1();
        stock2 = new Stock2();
        stock3 = new Stock3();
    }

    //购买基金
    public void buyFund() {
        stock1.buy();
        stock2.buy();
        stock3.buy();
    }

    //赎回基金
    public void sellFund() {
        stock1.sell();
        stock2.sell();
        stock3.sell();
    }
}

2、股票、国债、房地产类

这里放一个股票作为示例,其余债券类似。内部由买入和卖出两种操作。

public class Stock1 {
    //买股票
    public void buy() {
        System.out.println("股票1买入");
    }
    
    //卖股票
    public void sell() {
        System.out.println("股票1卖出");
    }
}

3、client客户端

用户通过该类对基金进行购买和赎回操作。

package designMode.facade2;

public class Client {
    public static void main(String[] args) {
        Fund fund = new Fund();

        //基金购买
        fund.buyFund();
        System.out.println("-------------");
        //基金赎回
        fund.sellFund();
    }
}

4、运行结果:

up-2c93dedf0e704fb5f52b34f5f04fe057156.png

由此可见,外观模式十分简单,我们只需要在客户端购买和赎回即可,内部的任何操作都不需要我们关注,对于面向对象有一定基础的朋友,即使没有听说过外观模式,也完全有可能在很多时候使用它,因为它完美的体现了依赖倒转原则和迪米特法则的思想,是非常常用的模式之一。

我们使用外观模式的情况有很多,比如经典的MVC三层架构,可以考虑在数据访问层和业务员逻辑层、业务逻辑层和表示层的层与层之间简化外观Facade,降低耦合度。对于复杂难以维护的老系统,直接去修改或扩展都可能产生很多原因,可以分两个小组,一个开发facade与老系统的交互,另一个只需要了解facade接口,直接开发新系统调用这些接口即可。

 

素小暖讲设计模式

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值