[导读]
[设计模式整理笔记 一] 基础知识
[设计模式整理笔记 二] 简单工厂模式(Simple Factory)
[设计模式整理笔记 三] 工厂模式(Factory)
[设计模式整理笔记 四] 抽象工厂模式(Abstract Factory)
[设计模式整理笔记 五] 创建者模式(Builder)
[设计模式整理笔记 六] 工厂模式与创建者模式总结
[设计模式整理笔记 七] 原型模式(ProtoType)
[设计模式整理笔记 八] 单例模式(Singleton)
[设计模式整理笔记 九] 外观模式(Facade)
....后续, 包括部分例子
[/导读]
外观模式的设计是十分简单的,就是对一个对象进行包装,对外的的接口统一由外观类来进行提供。 主要由三部分组成:抽象外观类,具体外观类,其它使用者。例如:在上面的计算工资模块中, 不单单是一个系统需要个人实得工资, 集团内部网站也需要得到个人工资信息供员工自行查询? 这时候就需要做一个接口供集团内部网来使用。而且返回的是一个最后的数据, 不需要在外观类的外面任何系统进行计算或者组装, 方便日后维护。下面看一下代码例子如下:
设计深圳子公司的总工资计算类:

{
public interface ISalary
{
decimal CommandSalary();
}
}
namespace ConsoleApp
{
public class ShenZhenSalary : ISalary
{
public decimal CommandSalary()
{
//这里是计算过程..省了
//假设返回总工资10000元
return 10000;
}
}
}

{
public interface IFund
{
decimal CommandFund();
}
}
namespace ConsoleApp
{
public class ShenZhenFund : IFund
{
public decimal CommandFund()
{
//这里是计算过程..省了
//假设返回180
return 180;
}
}
}
设计深圳子公司的税计算类:

{
public interface ITax
{
decimal CommandTax();
}
}
namespace ConsoleApp
{
public class ShenZhenTax : ITax
{
public decimal CommandTax()
{
//这里是计算过程..省了
//假设返回580
return 580;
}
}
}
定义抽象外观类, 员工在内部网查询个人的实得工资时,有下面信息:总工资,应该扣除的基金,应该扣除的税,个人实得工资 以上几栏。类定义如下:

{
/// <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();
}
}
具体外观类定义如下:

{
/// <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;
}
}
}
下面就是集团公司内部网调用如下:

{
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的原理好相似吧。其实总结起来, 大家都应该用过这样的设计思想了, 如果不知道其名称的, 那就记下来, 叫外观模式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?