外观模式(三层解耦)

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

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

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

  外观模式的主要用于解耦、减少依赖关系、为新旧系统交互提供接口,下面看一下外观模式的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也能作为新旧系统之间的接口使用,这也是外观模式的典型应用。

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

  

时间: 2025-01-06 21:38:43

外观模式(三层解耦)的相关文章

C++设计模式之外观模式(三)

3.外观模式总结 引入了外观类,解除了客户类与子系统的耦合性.客户类不需要直接操作子系统,而是由外观类负责处理,对客户端而言是透明的,客户类只需要操作外观类就可以了,符合"迪迷特法则".如果多个地方需要Facade,也就是说外观可以实现功能的共享,也就是实现复用,同样的调用代码只用在Facade里面写一次就好了,不用在多个调用的地方重复写.如果某个系统模块需要修改,只需要修改这个系统模块就可以了,对客户端无影响,维护性好.还有一个潜在好处,对使用Facade的人员来说,Facade节省

外观模式(Facade Pattern)

一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ”门面“模式.下面就具体介绍下外观模式. 二.外观模式的详细介绍 2.1 定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中

11.设计模式_外观模式

一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 "门面"模式.下面就具体介绍下外观模式. 二.外观模式的详细介绍 2.1 定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内

js外观模式

外观模式(Facade)为子系统中的一组接口提供了一个一致的界面,此模块定义了一个高层借口,这个接口使得这一子系统更加容易使用. 外观模式不仅简化类中的接口,而且对接口与调用者也进行了解耦.外观模式经常被认为开发者必备,它可以将一些复杂操作封装起来,并创建一个简单的接口用于调用. var fuhao={ }; fuhao.huofang=function(){ return '馒头'; } fuhao.chuliliangshi=function(){ return '面粉'; } fuhao.

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

介绍 外观模式(Facade)为子系统中的一组接口提供了一个一致的界面,此模块定义了一个高层接口,这个接口值得这一子系统更加容易使用. 正文 外观模式不仅简化类中的接口,而且对接口与调用者也进行了解耦.外观模式经常被认为开发者必备,它可以将一些复杂操作封装起来,并创建一个简单的接口用于调用. 外观模式经常被用于JavaScript类库里,通过它封装一些接口用于兼容多浏览器,外观模式可以让我们间接调用子系统,从而避免因直接访问子系统而产生不必要的错误. 外观模式的优势是易于使用,而且本身也比较轻量

NET设计模式 第二部分 结构性模式(11):外观模式(Fa&#231;ade Pattern)

外观模式(Façade Pattern) ——.NET设计模式系列之十二 Terrylee,2006年3月 概述 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化.那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?这就是要说的Façade 模式. 意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.[GOF <设计模式>] 示意

.NET设计模式(12):外观模式(Fa&#231;ade Pattern)(转)

概述 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化.那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?这就是要说的Façade 模式. 意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.[GOF <设计模式>] 示意图 门面模式没有一个一般化的类图描述,下面是一个示意性的对象图: 图1 Façade模式示意性对象图 生活中

C#设计模式之十外观模式(Facade Pattern)【结构型】

原文:C#设计模式之十外观模式(Facade Pattern)[结构型] 一.引言 快12点半了,要开始今天的写作了.很快,转眼设计模式已经写了十个了,今天我们要讲[结构型]设计模式的第五个模式,该模式是[外观模式],英文名称是:Facade Pattern.我们先从名字上来理解一下"外观模式".我看到了"外观"这个词语,就想到了"外表"这个词语,两者有着很相近的意思.就拿谈恋爱来说,"外表"很重要,如果第一眼看着很舒服.有眼

C#设计模式——外观模式

一.外观模式介绍: 外观模式为子系统的一组接口提供一个统一的接口.外观定义了一个高层接口,使得子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中方法,从而外观模式让客户和子系统之间避免了紧耦合,并且外观模式可以解决层结构分离.降低系统耦合度和为新旧系统交互提供接口功能.外观模式也称作 "门面"模式. 二.出现背景: 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随