[设计模式整理笔记 九] 外观模式(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的原理好相似吧。其实总结起来, 大家都应该用过这样的设计思想了, 如果不知道其名称的, 那就记下来, 叫外观模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值