zoukankan      html  css  js  c++  java
  • [设计模式整理笔记 九] 外观模式(Facade)

    [导读]

    [设计模式整理笔记 一] 基础知识

    [设计模式整理笔记 二] 简单工厂模式(Simple Factory)

    [设计模式整理笔记 三] 工厂模式(Factory)

    [设计模式整理笔记 四] 抽象工厂模式(Abstract Factory)

    [设计模式整理笔记 五] 创建者模式(Builder)

    [设计模式整理笔记 六] 工厂模式与创建者模式总结

    [设计模式整理笔记 七] 原型模式(ProtoType)

    [设计模式整理笔记 八] 单例模式(Singleton)

    [设计模式整理笔记 九] 外观模式(Facade)

    ....后续, 包括部分例子

    [/导读]

    外观模式的设计是十分简单的,就是对一个对象进行包装,对外的的接口统一由外观类来进行提供。 主要由三部分组成:抽象外观类,具体外观类,其它使用者。例如:在上面的计算工资模块中, 不单单是一个系统需要个人实得工资, 集团内部网站也需要得到个人工资信息供员工自行查询? 这时候就需要做一个接口供集团内部网来使用。而且返回的是一个最后的数据, 不需要在外观类的外面任何系统进行计算或者组装, 方便日后维护。下面看一下代码例子如下:

    设计深圳子公司的总工资计算类: 

    代码
    namespace ConsoleApp
    {
        
    public interface ISalary
        {
            
    decimal CommandSalary();
        }
    }

    namespace ConsoleApp
    {
        
    public class ShenZhenSalary : ISalary
        {
            
    public decimal CommandSalary()
            {
                
    //这里是计算过程..省了

                
    //假设返回总工资10000元            
                return 10000;
            }
        }
    }
    设计深圳子公司的基金计算类:  
    代码
    namespace ConsoleApp
    {
        
    public interface IFund
        {
            
    decimal CommandFund();
        }
    }

    namespace ConsoleApp
    {
        
    public class ShenZhenFund : IFund
        {
            
    public decimal CommandFund()
            {
                
    //这里是计算过程..省了

                
    //假设返回180  
                return 180;
            }
        }
    }

    设计深圳子公司的税计算类: 

    代码
    namespace ConsoleApp
    {
        
    public interface ITax
        {
            
    decimal CommandTax();
        }
    }

    namespace ConsoleApp
    {
        
    public class ShenZhenTax : ITax
        {
            
    public decimal CommandTax()
            {
                
    //这里是计算过程..省了

                
    //假设返回580  
                return 580;
            }
        }
    }

    定义抽象外观类, 员工在内部网查询个人的实得工资时,有下面信息:总工资,应该扣除的基金,应该扣除的税,个人实得工资 以上几栏。类定义如下:

    代码
    namespace ConsoleApp
    {
        
    /// <summary>
        
    /// 抽象外观类
        
    /// </summary>
        public interface IEmployeePay
        {
            
    /// <summary>
            
    /// 总工资
            
    /// </summary>
            
    /// <returns></returns>
            decimal Salary();
            
    /// <summary>
            
    /// 应该扣除的基金
            
    /// </summary>
            
    /// <returns></returns>
            decimal Fund();
            
    /// <summary>
            
    /// 应该扣除的税
            
    /// </summary>
            
    /// <returns></returns>
            decimal Tax();
            
    /// <summary>
            
    /// 个人实得工资
            
    /// </summary>
            
    /// <returns></returns>
            decimal Pay();
        }
    }

    具体外观类定义如下:

    代码
    namespace ConsoleApp
    {
        
    /// <summary>
        
    /// 员工实得工资,这个类为具体外观类
        
    /// </summary>
        public class EmployeePay : IEmployeePay
        {
            
    /// <summary>
            
    /// 取得总工资
            
    /// </summary>
            public virtual decimal Salary()
            {
                ShenZhenSalary SalarySZ 
    = new ShenZhenSalary();
                
    return SalarySZ.CommandSalary();
            }

            
    /// <summary>
            
    /// 取得应该扣除的基金
            
    /// </summary>
            public virtual decimal Fund()
            {
                ShenZhenFund FundSZ 
    = new ShenZhenFund();
                
    return FundSZ.CommandFund();
            }

            
    /// <summary>
            
    /// 取得应该扣除的税
            
    /// </summary>
            public virtual decimal Tax()
            {
                ShenZhenTax TaxSZ 
    = new ShenZhenTax();
                
    return TaxSZ.CommandTax();
            }

            
    /// <summary>
            
    /// 取得实得工资
            
    /// </summary>
            
    /// <returns></returns>
            public virtual decimal Pay()
            {
                EmployeePay employeePay 
    = new EmployeePay();
                
    decimal Salary = employeePay.Salary();
                
    decimal Fund = employeePay.Fund();
                
    decimal Tax = employeePay.Tax();

                
    return Salary - Fund - Tax;
            }
        }
    }

    下面就是集团公司内部网调用如下:

    代码
    namespace ConsoleApp
    {
        
    class Program
        {
            
    /// <summary>
            
    /// 外部的调用,不需任何计算,需要改变计算方法时,
            
    /// 在抽象外观类与具体外观类里面改动就可以了, 这样可以提供给N个使用者使用,
            
    /// </summary>
            
    /// <param name="args"></param>
            public static void Main(string[] args)
            {
                IEmployeePay EmployeePay 
    = new EmployeePay();

                Console.WriteLine(
    "总工资为:" + EmployeePay.Salary());
                Console.WriteLine(
    "应该扣除的基金为:" + EmployeePay.Fund());
                Console.WriteLine(
    "应该扣除的税为:" + EmployeePay.Fund());
                Console.WriteLine(
    "个人实得工资为:" + EmployeePay.Pay());

                Console.ReadLine();
            }
        }
    }

    其它系统, 如集团信息平台,集团财务系统,集团报税系统,集团基金系统都是这样调用, 需要发生逻辑变化时,只修改外观类就完成工作,不须外面的子系统进行任何修改。 看起来和Web Services的原理好相似吧。其实总结起来, 大家都应该用过这样的设计思想了, 如果不知道其名称的, 那就记下来, 叫外观模式。

  • 相关阅读:
    Django关于StreamingHttpResponse与FileResponse响应文件或视频的下载请求
    APScheduler可能遇到的问题
    django中model聚合使用
    Java 递归判断迷宫问题是否有路
    direct path read/write (直接路径读/写)
    DRM 简介
    SQL Server2008表名中含“.”号处理方法
    Java学习之:JDK动态代理与CGLIB动态代理
    强大易用!新一代爬虫利器 Playwright
    为什么cudaMalloc()参数是二级指针
  • 原文地址:https://www.cnblogs.com/whtydn/p/1651373.html
Copyright © 2011-2022 走看看