说到外观模式,很容易想到的是设计一件漂亮的衣服然后穿上自己的身上,让自己看起来更加的漂亮,但是这个可能并不是这样子的,从更深层次的来说,外观更应该是所见即所得的,对于观众来说,看起来可能就是很简单,但是里面所有的东西的复杂程度,我们并不知道。

  在程序开发的过程中,我们时常的会用到一些类与类之间的关联关系,或者直接通过一个操作来实现多个事情,那么怎样做到呢,很容易想到,我们可以在一个方法里面实现多种行为,将这些方法放在一个类中,这个类就成了我们的外观类,在进行与外界交互的时候,我们不需要再进行复杂的操作,直接调用外观类里面的方法就能实现了。

  说了这么多,那么什么是外观模式呢?外观模式,为子系统的一组接口提供了一个统一的界面,此模式定义了一个高级的接口,这个接口使得这一子系统更加容易使用。

  外观模式的主要用于解耦、减少依赖关系、为新旧系统交互提供接口,下面看一下外观模式的UML图:

  

  通过上图,我们可以看出减少了Client与子系统的依赖关系,降低了Client与子系统之间的耦合度,同时Fecade也充当了接口的作用,下面我们通过外观模式实现三层的表现层与业务逻辑层的解耦:

  三层UML图:

  

  首先,建立Models层,并添加相应的类,包括Student类、Grade类、StudentAndGrade类,代码如下:

namespace Demo.Models
{public class Student{public int ID { get; set; }public string Name { get; set; }public int Age { get; set; }public int GradeID { get; set; }}
}

Student

namespace Demo.Models
{public class Grade{public int GradeID { get; set; }public string GradeName { get; set; }}
}

Grade

namespace Demo.Models
{public class StudentAndGrade{public Student stu { get; private set; }public Grade grade { get; private set; }public StudentAndGrade(int StuID, string Name, int Age, int GradeID, string GradeName){stu = new Student() { ID = StuID, Name = Name, Age = Age };grade = new Grade() { GradeID = GradeID, GradeName = GradeName };}}
}

StudentAndGrade

  接着,建立DAL层,用于实现对Student和Grade的增加和查询,包含StudentDAL类、GradeDAL类,代码如下:

namespace Demo.DAL
{/// <summary>/// 和数据库进行交互的,先使用集合进行模拟/// </summary>public class StudentDAL{private static List<Student> List = new List<Student>();public List<Student> GetAllStudents(){return List;}public bool Add(Student stu){try{List.Add(stu);return true;}catch (Exception){return false;}}}
}

StudentDAL

namespace Demo.DAL
{public class GradeDAL{private List<Grade> List = new List<Grade>(){//new Grade() {  GradeID=1, GradeName= "C#"},//new Grade() {  GradeID=2,GradeName="ADO.Net"},//new Grade() { GradeID=3,GradeName="Asp.Net"}
        };public List<Grade> GetAllGrades(){return List;}public bool Add(Grade grade){try{List.Add(grade);return true;}catch (Exception){return false;throw;}}}
}

GradeDAL

  然后,建立Facade层,定义FacadePattern类实现添加StudentAndGrade对象的方法,并且实现获取所有所有的学生、年级信息的方法,代码如下:

namespace Demo.Facade
{public class FacadePattern{private StudentBLL studentBLL = null;private GradeBLL gradeBLL = null;public FacadePattern(){studentBLL = new StudentBLL();gradeBLL = new GradeBLL();}public void Add(StudentAndGrade StudentAndGrade){studentBLL.Add(StudentAndGrade.stu);gradeBLL.Add(StudentAndGrade.grade);}public List<Student> GetAllStudents(){return studentBLL.GetAllStudents();}public List<Grade> GetAlllGrades(){return gradeBLL.GetAllGrades();}}
}

FacadePattern

  最后,建立UI层,用于数据的添加和展示,具体代码如下:

class Program{static void Main(string[] args){StudentAndGrade StudentAndGrade = new StudentAndGrade(1, "张三", 20, 1, "大一新生");FacadePattern facade = new FacadePattern();facade.Add(StudentAndGrade);List<Student> stuList = facade.GetAllStudents();foreach (Student stu in stuList){Console.WriteLine("{0},{1},{2}", stu.ID, stu.Name, stu.Age);}List<Grade> gradeList = facade.GetAlllGrades();foreach (Grade grade in gradeList){Console.WriteLine("{0},{1}", grade.GradeID, grade.GradeName);}Console.ReadKey();}}

Main

  整个代码已经实现了表现层与业务逻辑层的解耦,减少了它们之间的依赖关系,同时说明了Facade也能作为新旧系统之间的接口使用,这也是外观模式的典型应用。

  本篇文章外观设计模式至此,谢谢您收看我的博客。

  

转载于:https://www.cnblogs.com/mointor/p/5169564.html

外观模式(三层解耦)相关推荐

  1. 如何让孩子爱上设计模式 ——11.外观模式(Facade Pattern)

    如何让孩子爱上设计模式 --11.外观模式(Facade Pattern) 标签: 设计模式初涉 场景引入 相信各位玩过LOL英雄联盟游戏的童鞋,对下面两个英雄都不会陌生吧:       分别是瑞雯和 ...

  2. 【白话设计模式二】外观模式(Facade)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  3. 外观模式(Façade Pattern)

    概述 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化.那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依 ...

  4. 深入理解JavaScript系列(30):设计模式之外观模式

    介绍 外观模式(Facade)为子系统中的一组接口提供了一个一致的界面,此模块定义了一个高层接口,这个接口值得这一子系统更加容易使用. 正文 外观模式不仅简化类中的接口,而且对接口与调用者也进行了解耦 ...

  5. 23种设计模式——外观模式

    引言: 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 & ...

  6. 设计模式之外观模式(Facade)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. [设计模式]外观模式

    1. 定义 外观模式 提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更加容易使用. 外观不仅简化了系统内接口的使用,也将客户从组件中的子系统中解耦,外观和适配器都可 ...

  8. 外观模式 - 设计模式学习

    外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 怎么叫更加容易使用呢?多个方法变成一个方法,在外观看来,只需知道这个功 ...

  9. 十一:外观模式详解(Service,action与dao)

    定义:外观模式是软件工程中常用的一种软件设计模式.它为子系统中的一组接口提供一个统一的高层接口.这一接口使得子系统更加容易使用. 该定义引自百度百科,它的表现很简单,将一系列子接口的功能进行整理,从而 ...

最新文章

  1. 2019.01.07|区块链技术头条
  2. 商丘网络推广中网站内部优化需要注意的要点有哪些?
  3. Django笔记-5-视图
  4. 获取数据 - 将Excel文件读入矩阵matrix中 - Python代码
  5. mysql 导入 xc2 xa0_Python 字符串处理特殊空格xc2xa0tn Non-breaking space
  6. 公司打印机的安装和使用
  7. linux基础命令学习笔记(二)
  8. 教你正确设置CrossOver的Wine配置(一)
  9. VS2015 编译libevent库
  10. android定位问题
  11. linux免采集卡直播ps4,ps4免采集卡直播方法
  12. canvas特效收集
  13. rgb sw 线主板接口在哪_火力升级 华硕B460重炮手PRO主板豪横上市_搜狐汽车
  14. 乙酸乙酯密度是多少 乙酸乙酯的用途
  15. 泰勒公式系列之一多项式逼近
  16. 解决mysql插入中文出现错误ERROR 1366 (HY000): Incorrect string value: ‘\x80\x85\xEF\xBC\x8C\xE6...‘ for column
  17. 深度学习中处理类别不平衡问题主流方法总结
  18. hacker vip教程
  19. Android中关于轨迹定位点去噪算法,使用简单
  20. 97年的欧冠决赛 多特蒙德VS尤文 中里德尔的梦

热门文章

  1. php l方法,ThinkPHP的L方法使用简介
  2. 插入模板_WordPress在文章列表和内容页插入广告
  3. MongoDb 大数据查询优化、 MongoDB 索引、复合索引、唯一索引、 explain 分 析查询速度
  4. LeetCode MySQL 1777. 每家商店的产品价格(行列转换)
  5. LeetCode 59. 螺旋矩阵 II LeetCode 54. 螺旋矩阵
  6. python比较时间的最大值_时间戳的最大值
  7. python获取股票数据_python根据股票代码获取当前数据
  8. python脚本编程手册_Python 入门指南 — Python2.7 手册 2.7 documentation - 脚本之家在线手册...
  9. php必须汉字,php怎么只保留汉字
  10. 爬虫——多线程糗事百科案例