C军

不玩博客了!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

  怎么叫更加容易使用呢?多个方法变成一个方法,在外观看来,只需知道这个功能完成哪些功能就OK了,不必记得一大堆对象,一大堆方法。

  外观模式UML图:

    

  外观模式的基本结构代码:

namespace ConsoleApplication1
{
    //四个子系统类
    class SubSystemOne
    {
        public void MethodOne()
        {
            Console.WriteLine("子系统方法一");
        }
    }

    class SubSystemTwo
    {
        public void MethodTwo()
        {
            Console.WriteLine("子系统方法二");
        }
    }

    class SubSystemThree
    {
        public void MethodThree()
        {
            Console.WriteLine("子系统方法三");
        }
    }

    class SubSystemFour
    {
        public void MethodFour()
        {
            Console.WriteLine("子系统方法四");
        }
    }
    
    //外观类
    class Facade
    {
        SubSystemOne one;       //外观类,它需要了解所有的子系统的方法或属性,进行组合,以被外界调用
        SubSystemTwo two;
        SubSystemThree three;
        SubSystemFour four; 

        public Facade()
        {
            one = new SubSystemOne();
            two = new SubSystemTwo();
            three = new SubSystemThree();
            four = new SubSystemFour();
        }

        public void MethodA()       //这样相对于外部来说,调用MethiodA方法就等于同时调用了3个方法,但外观看起来是一个方法
        {
            Console.WriteLine("\n方法组A()");
            one.MethodOne();
            two.MethodTwo();
            four.MethodFour();
        }

        public void MethodB()
        {
            Console.WriteLine("\n方法组B()");  
            two.MethodTwo();
            three.MethodThree();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Facade facade = new Facade();
            facade.MethodA();
            facade.MethodB();

            Console.ReadKey();
        }
    }  
}

  回到《大话设计模式》里的买股票例子:

namespace ConsoleApplication1
{
    //股票1
    class Stock1
    {
        //卖股票
        public void Sell()
        {
            Console.WriteLine("股票1卖出");
        }

        //买股票
        public void Buy()
        {
            Console.WriteLine("股票1买入");
        }
    }

    //股票2
    class Stock2
    {
        //卖股票
        public void Sell()
        {
            Console.WriteLine("股票2卖出");
        }

        //买股票
        public void Buy()
        {
            Console.WriteLine("股票2买入");
        }
    }

    //股票3
    class Stock3
    {
        //卖股票
        public void Sell()
        {
            Console.WriteLine("股票3卖出");
        }

        //买股票
        public void Buy()
        {
            Console.WriteLine("股票3买入");
        }
    }

    //国债1
    class NationalDebt1
    {
        //卖国债
        public void Sell()
        {
            Console.WriteLine("国债1卖出");
        }

        //买国债
        public void Buy()
        {
            Console.WriteLine("国债1买入");
        }
    }

    //房地产1
    class Realty1
    {
        //卖出房产
        public void Sell()
        {
            Console.WriteLine("房产1卖出");
        }

        //买房产
        public void Buy()
        {
            Console.WriteLine("房产1买入");
        }
    }

    class Fund
    {
        Stock1 gu1;
        Stock2 gu2;
        Stock3 gu3;
        NationalDebt1 nd1;
        Realty1 rt1;

        public Fund()
        {
            gu1 = new Stock1();
            gu2 = new Stock2();
            gu3 = new Stock3();
            nd1 = new NationalDebt1();
            rt1 = new Realty1();
        }

        public void BuyFund()
        {
            gu1.Buy();
            gu2.Buy();
            gu3.Buy();
            nd1.Buy();
            rt1.Buy();
        }

        public void SellFund()
        {
            gu1.Sell();
            gu2.Sell();
            gu3.Sell();
            nd1.Sell();
            rt1.Sell();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Fund jijin = new Fund();
            //基金购买
            jijin.BuyFund();
            //基金赎回
            jijin.SellFund();

            Console.ReadKey();
        }
    }  
}

  如何使用外观模式:

  首先,在设计初期阶段,应该要有意识的将不同的两个层分离,比如经典的三层架构,就需要考虑在数据访问层和业务逻辑层、业务逻辑层和表示层的层与层之间建立外观Facade,这样可以为复杂的子系统提供一个简单的接口,使得耦合大大降低。

  其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂。大多数模式的使用时也会产生很多很小的类,这本是好事,但也给外部调用它们的用户程序带来了使用上的困难,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖。

  最后,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为他包含非常重要的功能,新的需求开发必须要依赖于它。此时用外观模式Facade也是非常合适的。你可以为新系统开发一个外观Facade类,来提供设计粗糙或高难度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂工作。

 

 

 

 

 

 

posted on 2013-03-17 23:04  逆心  阅读(420)  评论(0编辑  收藏  举报