首页 > 技术文章 > 外观模式

ningxinjie 2020-01-16 16:50 原文

有点像命令模式的样子,但是命令模式是将步骤定义在抽象基类中,抽象方法也定义在抽象基类中,子类实现这些类,去实现。(适用于大致步骤相同,内部逻辑不同)

而外观模式则是将逻辑直接写在外观类中(适用于操作固定,内部逻辑也不变,某种情况下重复出现)

 外观模式,就是不需要将所有内部都展示出来,用户看到的是外观,使用的也是外观,他知道这个外观是干什么的就可以,具体内部如何实现,他不需要关心了,需要由外观模式类帮助实现。

最简单最易懂的案例,书写外观模式

案例:银行系统给人发贷款的时候,需要检查这个人银行资金、是否有贷款、信用情况,如果每次检查一个人的时候,操作员每个分别检查,那么代码重复的厌恶性就出现了,我们将这些检查封装成外观模式,这样检查某个人的时候,只需要使用外观模式类,简单明了

  #region 用户
    class Customer
    {
        private string _name;
        public Customer(string name)
        {
            this._name = name;
        }
        public string Name { get { return _name; } }
    }
    #endregion
 #region 具体需要判别的系统类
    //银行系统
    class Bank
    {
        public bool HasSufficientSavings(Customer customer,int amount)
        {
            Console.WriteLine("检查{0}借{1:C}是否通过",customer.Name,amount);
            return true;
        }
    }
    //信用系统
    class Credit
    {
        public bool HasGoodCredit(Customer customer)
        {
            Console.WriteLine("检查{0}信用是否通过",customer.Name);
            return true;
        }
    }
    //贷款系统
    class Loan
    {
        public bool HasNoBadLoans(Customer customer)
        {
            Console.WriteLine("检查{0}是否无不良贷款记录", customer.Name);
            return true;
        }
    }
    #endregion
 #region 外观类
    class Mortgage
    {
        private Bank bank = new Bank();
        private Credit credit = new Credit();
        private Loan loan = new Loan();
        public bool IsEligible(Customer customer,int amount)
        {
            bool isOk = true;
            if (!(bank.HasSufficientSavings(customer,amount)&&credit.HasGoodCredit(customer)&&loan.HasNoBadLoans(customer))) { isOk = false; }
            return isOk;
        }
    }
    #endregion
 static void Main(string[] args)
        {
            Customer customer = new 外观模式.Customer("小丽");
            Mortgage mortgage = new Mortgage();
            Console.WriteLine("是否可以借款?"+mortgage.IsEligible(customer,20000));
            Console.ReadKey();
        }

 

推荐阅读