当前位置:首页 > 通信资讯 > 正文

c#常见设计模式(c#23种设计模式)

1. 概述

  为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

2. 模式中的角色

  2.1 外观类(facade):外观类知道哪些子系统类负责处理请求,将客户的请求代理给恰当的子系统对象。

  2.2 子系统类集合(subsystem classes):子系统类集合实现了子系统的功能,处理外观类对象指派的任务。

3. 模式解读

  3.1 外观模式的类图

c#常见设计模式(c#23种设计模式)

  3.2 外观模式的代码实现

?
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677/// <summary>/// 子系统中的一个类/// </summary>public class subsystemone{public void methodeone(){console.writeline("sub system first method.");}}/// <summary>/// 子系统中一个类/// </summary>public class subsystemtwo{public void methodtwo(){console.writeline("sub system second method.");}}/// <summary>/// 子系统中一个类/// </summary>public class subsystemthree{public void methodthree(){console.writeline("sub system third method.");}}/// <summary>/// 子系统中一个类/// </summary>public class subsystemfour{public void methodfour(){console.writeline("sub system fourth method.");}}/// <summary>/// 外观类/// </summary>public class facade{private subsystemone one;private subsystemtwo two;private subsystemthree three;private subsystemfour four;public facade(){one = new subsystemone();two = new subsystemtwo();three = new subsystemthree();four = new subsystemfour();}public void methoda(){console.writeline("\nmethod group a----");one.methodeone();two.methodtwo();four.methodfour();}public void methodb(){console.writeline("\nmethod group b----");two.methodtwo();three.methodthree();}}

 3.3 客户端代码

?
123456789101112class program{static void main(string[] args){// 由于facade的作用,客户端可以根本不知道子系统类的存在facade facade = new facade();facade.methoda();facade.methodb();console.read();}}

 运行结果

c#常见设计模式(c#23种设计模式)

4. 模式总结

  4.1 优点

    4.1.1 facade模式降低了客户端对子系统使用的复杂性。

    4.1.2 外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。

    4.1.3 通过合理使用facade,可以帮助我们更好的划分访问的层次。

  4.2 缺点

    过多的或者是不太合理的facade也容易让人迷惑,到底是调用facade好呢,还是直接调用模块好。

  4.3 适用场景

    4.3.1 需要将设计进行分层时考虑facade模式。

    4.3.2 在开发阶段,子系统往往因为重构变得越来越复杂,增加外观模式可以提供一个简单的接口,减少它们之间的依赖。

    4.3.3 在维护一个遗留的大型系统时,可以这个系统已经非常难以维护和扩展,可以为新系统开发一个facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与facade对象交互,facade与遗留代码交互所有复杂的工作。

5. 应用举例:分层开发中,对数据访问层我们增加dataaccess作为对外的接口来操作数据库子系统。

  5.1 实现类图

c#常见设计模式(c#23种设计模式)

  5.2 实现代码

?
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667public class employee{public string name { get; set; }public int age { get; set; }public salary salary { get; set; }}public class salary{public datetime from { get; set; }public datetime to { get; set; }public decimal amount { get; set; }}public class employeedataaccess{public void saveemployee(employee employee){console.writeline("save employee to database.");}public void deleteemployee(employee employee){console.writeline("remode employee from database.");}}public class salarydataaccess{public void savesalary(salary salary){console.writeline("save salary to database.");}public void deletesalary(salary salary){console.writeline("remove salary from database.");}}/// <summary>/// dataaccess为客户端提供一个简单的接口/// </summary>public class dataaccess{private employeedataaccess employeedataaccess = new employeedataaccess();private salarydataaccess salarydataaccess = new salarydataaccess();public void saveemployee(employee employee){// 先保存员工基本信息employeedataaccess.saveemployee(employee);// 保存员工薪水信息salarydataaccess.savesalary(employee.salary);}public void removeemployee(employee employee){// 先删除员工薪水信息salarydataaccess.deletesalary(employee.salary);// 删除员工基本信息employeedataaccess.deleteemployee(employee);}}

  5.3 客户端代码

?
12345678910111213class program{static void main(string[] args){dataaccess.dataaccess dataaccess = new dataaccess.dataaccess();dataaccess.employee employee = new dataaccess.employee() { salary = new dataaccess.salary(), name = "wang kevin", age = 22 };dataaccess.saveemployee(employee);dataaccess.removeemployee(employee);console.read();}}

  运行结果

c#常见设计模式(c#23种设计模式)

以上就是本文的全部内容,希望能给大家一个参考,也希望大家多多支持服务器之家。

如果您对该产品感兴趣,请填写办理(客服微信:xiaoxiongyidong)

为您推荐:

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。