外观模式(三层解耦)

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

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

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

  外观模式的主要用于解耦、减少依赖关系、为新旧系统交互提供接口,下面看一下外观模式的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT学习笔记(十一):QString类

QT学习笔记&#xff08;十一&#xff09;&#xff1a;QString类1、概述2、编辑操作3、查询操作3、转换操作1、概述 1.1 QString 类是 Qt 中用于表示字符串的类&#xff0c;实现在 QtCore 共享库中。QString 类在实现上有以下特征: 1&#xff09;字符串采用 Unicode 内部编码&…

人工智能六十年技术简史

作者 | 李理出品 | AI科技大本营&#xff08;rgznai100&#xff09;人类的进化发展史就是一部人类制造和使用工具的历史&#xff0c;不同的工具代表了人类的进化水平。从石器时代、铁器时代、蒸汽时代、电气时代再到现在的信息时代&#xff0c;我们使用更加先进便捷的工具来改变…

QT学习笔记(十二):透明窗体设置

QT学习笔记&#xff08;十二&#xff09;&#xff1a;透明窗体设置 创建 My_Widget 类 基类为QWidget &#xff0c; My_Widget.cpp 源文件中添加代码 #include "widget.h" #include "ui_widget.h"#include <QGraphicsDropShadowEffect>// 构造函数…

【新书】崛起的超级智能:互联网大脑如何影响科技未来

来源&#xff1a;刘锋的未来课堂2019年7月&#xff0c;《崛起的超级智能&#xff1a;互联网大脑如何影响科技未来》由中信出版社正式出版。作者刘锋。吕乃基、石勇、吕本富做序。张亚勤、刘慈欣、周鸿祎、王飞跃、约翰.翰兹等专家为这本书撰写了推荐语。《崛起的超级智能》主要…

OpenCV学习笔记(一):Win10(x64)+Qt5.8(MSVC2013)+OpenCV3.1.0配置过程

OpenCV学习笔记&#xff08;一&#xff09;&#xff1a;Win10(x64)Qt5.8(MSVC2013)OpenCV3.1.0配置过程 Win10(x64)Qt5.8(MSVC2013)OpenCV3.1.0配置过程 配置需求 原版 Win10(x64) Qt5.8(MSVC2013) OpenCV3.1.0 第一步&#xff1a;安装QT 5.8 和OpenCV3.1.0 并配置环境变量…

Windows10安装TeXlive和TeXstudio

参考https://blog.csdn.net/aiwei169/article/details/81431363 进入官网http://tug.org/texlive/ 第一步 第二步 第三步 第四步 等待 安装包下载 解压下载的文件&#xff0c;将解压后的安装包放在英文路径下&#xff08;即不要包含中文的路径&#xff09; 修改安装路径&am…

QT环境配置:QT5.8.0与VS2013环境配置

QT环境配置&#xff1a;QT5.8.0与VS2013环境配置 1、下载VS2013&#xff0c;QT5.8.0&#xff0c;qt-vs-tools-msvc2013-2.1.1。 1&#xff09;VS2013版本为&#xff1a;Visual Studio Ultimate 2013 2&#xff09;QT5.8.0版本为&#xff1a;qt-opensource-windows-x86-msvc20…

云计算与边缘计算协同的九大应用场景剖析

来源 | 中国信息通信院CAICT未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&…

QT学习笔记(十三):绘制图像

QT学习笔记&#xff08;十三&#xff09;&#xff1a;绘制图像 paintEvent() 事件源码添加&#xff1a; #include <QPainter> #include <QImage> #include <QPixmap> #include <QBitmap> #include <QPicture>void Widget::paintEvent(QPaintEve…

【Robot学院】一文读懂世界智能制造大趋势!

本文来源&#xff1a;智造智库工业4.0在德国被认为是第四次工业革命&#xff0c;主要是指&#xff0c;在“智能工厂”利用“智能设备”将“智能物料”生产成为“智能产品”&#xff0c;整个过程贯穿以“网络协同”&#xff0c;从而提升生产效率&#xff0c;缩短生产周期&#x…

QT学习笔记(十四):QLayout的属性介绍

QT学习笔记&#xff08;十四&#xff09;&#xff1a;QLayout的属性介绍 主要包括QBoxLayout、和QGridLayout以及QFormLayout等的参数类似。 我主要说明一下QGridLayout在QtDesigner中它的属性的意义&#xff0c;以及QFormLayout的部分属性 一、QGridLayout属性介绍 1、QGri…

查找所引用的文献在某种期刊下的引用格式(引用风格)

当我们要引用一篇文献时&#xff0c;常常需要知道这篇文献在某种期刊下的引用格式是怎样的。举个例子&#xff0c;我需要查找“Gradient-based learning applied to document recognition”这篇文献在Neuroimage期刊下的引用格式怎么写。 首先在谷歌学术上搜索“Gradient-base…

web desktop在线演示

http://mydesk.sinaapp.com基于extjs的web desktop应用框架。 1、跨浏览器2、动态载入所需css,js文件3、权限管理4、支持多语种5、支持asp,jsp,php6、Sql server2008数据库QQ: 623076512 Email&#xff1a; mychirs21cn.com 转载于:https://www.cnblogs.com/mengfanrong/p/5…

贝叶斯网络之父:当前的机器学习其实处于因果关系之梯的最低层级

来源&#xff1a;大数据文摘每当提起“无人驾驶”汽车技术如何强大&#xff0c;又被大众赋予了怎样的期待&#xff0c;都会让人想起HBO电视剧Silicon Valley《硅谷》中的一个情节&#xff1a;硅谷大亨风险资本家Gregory的助手安排了一辆无人驾驶汽车送创业公司的小员工Jared回家…

QT学习笔记(十五):QLabel的点击事件(clicked)添加

QT学习笔记&#xff08;十五&#xff09;&#xff1a;QLabel的点击事件&#xff08;clicked&#xff09;添加 Qt之添加QLabel的点击事件 QLabel功能为显示了一个字符串或者图片等信息&#xff0c;它本身没有click信号。也就不能够响应click点击事件&#xff0c;有什么办法来实…

引用文献管理软件Mendeley

Mendeley是一款强大的文献管理软件&#xff0c;只需要把引用的文献导入进去&#xff0c;就可以生成各种风格的文献引用格式 首先去官网下载Mendeley&#xff1a;https://www.mendeley.com/download-desktop/ 安装好&#xff0c;打开后点击add添加文献&#xff1a; 添加文献的方…

​忆阻器会成为“存储墙”的破局者么

来源&#xff1a;半导体行业观察在计算量和数据量变得越来越大的今天&#xff0c;计算和存储成为了下一步科技发展中要面临的两座大山&#xff0c;下一代高性能计算机系统必须突破存储墙问题。在过去&#xff0c;这两者一直都是各自发展&#xff0c;再通过下游产品产生交集。但…

Halcon学习笔记(一):Qt+Halcon联合开发配置

Halcon学习笔记(1)&#xff1a;QtHalcon联合开发配置 首先是新建一个QT项目qtest_hc 方法一&#xff1a; 1)QT项目文件 qtest_hc 添加库&#xff1a; #1.包含目录添加 INCLUDEPATH D:/MVTec/HALCON-13.0/include INCLUDEPATH D:/MVTec/HALCON-13.0/include/halconcpp#2.链…

C1. 组队活动 Small(BNUOJ)

C1. 组队活动 SmallTime Limit: 1000msMemory Limit: 131072KB64-bit integer IO format: %lld Java class name: MainSubmit Status PID: 51280BNU ACM校队一共有名队员&#xff0c;从到标号&#xff0c;现在名队员要组成若干支队伍来相互学习、共同进步&#xff0c;为了…