Façade外观(结构型模式)

目录

意图(Intention)

结构(Structure)

优点

适用于

几种模式的区分

Example


意图(Intention)

为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

结构(Structure)

其中,

Facade:外观类为子系统提供一个共同的对外接口

ubsystem classes:实现子系统的功能;处理有Facade对象指派的任务;没有Facade的任何相关信息

Client:客户对象通过一个外观接口读写子系统中各接口的数据资源

优点

(1)实现了子系统与客户端之间的松耦合关系。

(2)客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。

适用于

1.要为一个复杂的子系统提供一个简单的接口时,子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类,这使得子系统更具有可重用性,也更容易对于子系统进行定制,但也给那些不需要定制子系统的用户带来一些使用上的困难,Facade可以提供一个简单的默认视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制的用户可以越过Facade层。

2.客户程序与抽象类的实现部分存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。

3.当需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,则可以让他们仅通过Facade进行通信,从而简化了它们之间的依赖关系。

几种模式的区分

Facade模式注重简化接口

Adapter模式注重转换接口

Bridge模式注重分离接口(抽象)与其实现

Decorator模式注重稳定接口的前提下为对象扩展功能

Example

背景:投资者自己进行投资,不论是购买股票还是债券等,都面临着多种多样的选择。可以用下面这幅图来表示,表示表示许多投资者,面临着多种投资选择(简单来说,就是股民要从数千只股票中选择投资哪个)

这时候,随着居民投资理财一时的提高,一个基金机构出现了,为大多数不懂投资,不懂股票的投资人带来了福音。简单来说,这个机构就是代替大家买股票投资,股民出钱,基金来运作投资。股民不需要关心我要去选择投资哪只股票,投资哪种债券,只要交给基金一切就OK了。下面这幅图用来表达基金出现之后。

其实,这就是Facade外观模式,将所有投资选择都组合成一个Facade类,股民只需要知道Facade类就可以了,里面的各种股票,债券类是不需要了解的,也就是说,外观类为子系统提供一个共同的对外接口。

下面是代码实现

对应结构图中Subsystems:各种投资选择(股票,债券,房地产......)

 class Stock1
    {
        public void Buy()
        {
            Console.WriteLine("Buy Stock1");
        }
        public void Sell()
        {
            Console.WriteLine("Sell Stock1");
        }
    }
    class Stock2
    {
        //代码同上
    }
    class NationalDebt
    {
        //代码同上
    }
    class Property
    {
       //代码同上
    }

对应结构图中的Facade类:基金类(组合了股票,国债和房地产)

class FacadeFund
    {
        Stock1 sk1;
        Stock2 sk2;
        Stock3 sk3;
        NationalDebt nd;
        Property p;
        public FacadeFund()
        {
            sk1 = new Stock1();
            sk2 = new Stock2();
            sk3 = new Stock3();
            nd = new NationalDebt();
            p = new Property();
        }
        //基金类,他需要了解所有的股票或者其它投资方式的方法或属性,进行组合,以备外界调用
        public void BuyFund()
        {
            sk1.Buy();
            sk2.Buy();
            sk3.Buy();
            nd.Buy();
            p.Buy();
        }
        public void SellFund()
        {
            sk1.Sell();
            sk2.Sell();
            sk3.Sell();
            nd.Sell();
            p.Sell();
        }
    }

客户端代码:

            FacadeFund fund = new FacadeFund();
            //购买基金
            fund.BuyFund();
            //基金赎回
            fund.SellFund();
            Console.Read();

如有错误,欢迎指正~~~~~~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值