說到外觀模式,很容易想到的是設計一件漂亮的衣服然後穿上自己的身上,讓自己看起來更加的漂亮,但是這個可能並不是這樣子的,從更深層次的來說,外觀更應該是所見即所得的,對於觀眾來說,看起來可能就是很簡單,但是裡面所有的東西的複雜程度,我們並不知道。 在程式開發的過程中,我們時常的會用到一些類與類之間的關聯
說到外觀模式,很容易想到的是設計一件漂亮的衣服然後穿上自己的身上,讓自己看起來更加的漂亮,但是這個可能並不是這樣子的,從更深層次的來說,外觀更應該是所見即所得的,對於觀眾來說,看起來可能就是很簡單,但是裡面所有的東西的複雜程度,我們並不知道。
在程式開發的過程中,我們時常的會用到一些類與類之間的關聯關係,或者直接通過一個操作來實現多個事情,那麼怎樣做到呢,很容易想到,我們可以在一個方法裡面實現多種行為,將這些方法放在一個類中,這個類就成了我們的外觀類,在進行與外界交互的時候,我們不需要再進行複雜的操作,直接調用外觀類裡面的方法就能實現了。
說了這麼多,那麼什麼是外觀模式呢?外觀模式,為子系統的一組介面提供了一個統一的界面,此模式定義了一個高級的介面,這個介面使得這一子系統更加容易使用。
外觀模式的主要用於解耦、減少依賴關係、為新舊系統交互提供介面,下麵看一下外觀模式的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也能作為新舊系統之間的介面使用,這也是外觀模式的典型應用。
本篇文章外觀設計模式至此,謝謝您收看我的博客。