设计模式学习之外观模式(Facade,结构型模式)(8)

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

2.为什么要使用外观模式
在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,从而导致客户程序随着子系统的变化而变化,那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?

现在来考虑这样一个抵押系统,当有一个客户来时,有如下几件事情需要确认:
到银行子系统查询他是否有足够多的存款,到信用子系统查询他是否有良好的信用,到贷款子系统查询他有无贷款劣迹。只有这三个子系统都通过时才可进行抵押。我们先不考虑Facade模式,那么客户程序就要直接访问这些子系统,分别进行判断。

 private static void Main(string[] args)
        {
            //外观,封装子系统
            Mortgage mortgage = new Mortgage();

            Customer customer = new Customer("Ann McKinsey");
            bool eligable = mortgage.IsEligible(customer, 125000);

            Console.WriteLine("
" + customer.Name +
                " has been " + (eligable ? "Approved" : "Rejected"));
            Console.ReadLine();
        }
        //顾客类
        public class Customer
        {
            private string _name;

            public Customer(string name)
            {
                this._name = name;
            }

            public string Name
            {
                get { return _name; }
            }
        }

        //银行子系统
        public class Bank
        {
            public bool HasSufficientSavings(Customer c, int amount)
            {
                Console.WriteLine("Check bank for " + c.Name);
                return true;
            }
        }

        //信用子系统
        public class Credit
        {
            public bool HasGoodCredit(Customer c)
            {
                Console.WriteLine("Check credit for " + c.Name);
                return true;
            }
        }

        //贷款子系统
        public class Loan
        {
            public bool HasNoBadLoans(Customer c)
            {
                Console.WriteLine("Check loans for " + c.Name);
                return true;
            }


        }

        public class Mortgage
        {
            private Bank bank = new Bank();
            private Loan loan = new Loan();
            private Credit credit = new Credit();

            public bool IsEligible(Customer cust, int amount)
            {
                Console.WriteLine("{0} applies for {1:C} loan
",
                  cust.Name, amount);

                bool eligible = true;

                if (!bank.HasSufficientSavings(cust, amount))
                {
                    eligible = false;
                }
                else if (!loan.HasNoBadLoans(cust))
                {
                    eligible = false;
                }
                else if (!credit.HasGoodCredit(cust))
                {
                    eligible = false;
                }

                return eligible;
            }
        }

可以看到引入Facade模式后,客户程序只与Mortgage发生依赖,也就是Mortgage屏蔽了子系统之间的复杂的操作,达到了解耦内部子系统与客户程序之间的依赖。

Facade模式在实际开发中最多的运用当属开发N层架构的应用程序了

原文地址:https://www.cnblogs.com/yxlblogs/p/3835540.html