外观模式
Posted 梦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了外观模式相关的知识,希望对你有一定的参考价值。
外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。
就是客户端和子系统之间耦合度高,依赖很强。通过接口使他们解藕,通过做一个中间层(BLL)使他们的复杂性,逻辑封装起来,对使用端(WEB、UI等)调用简单简洁,不用关心逻辑的变化。降低使用复杂性。
这种模式典型的应用就是三层架构。
界面层(User Interface layer)
业务逻辑层(Business Logic Layer)
数据访问层(Data access layer)
我们通常的做法是,界面直接访问数据,同时逻辑也在界面中写出来。并没有将他们剥离开。独立出来。
这样做的缺点:
1、界面和数据耦合度高,界面容易变化、数据也容易变化,导致一个地方变化全部要改动。
2、不容易重复使用
剥离开之后,界面层不需要了解数据层的各种变化(比如,增删改查计算方法的变化、换数据库系统),界面层只要结果。不管具体实现。
界面层过去要得到一个结果,很多时候需要一个组合的调用数据访问调用。还有就是重用。外观模式就解决了这类问题。
例如一个订单查询接口:
它最少需要两个东西,1、审核用户权限,2、查询出数据
订用端可以这么写:
static void Main(string[] args) { User user1 = new User(); if (!user1.check(1)) { Console.WriteLine("没有查询权限"); return; } order user1_order = new order(); if (!user1_order.check(1)) { Console.WriteLine("没有找到相关订单"); return; } Console.WriteLine("查询成功"); Console.Read(); }
外观模式需要把它们隔开,这样写:
/// <summary> /// 外观模式封装了 BLL业务逻辑层(Business Logic Layer) /// </summary> public class orderSearch { public bool check(int UserID, int orderID) { User user1 = new User(); order user1_order = new order(); return user1.check(UserID) && user1_order.check(orderID); } }
调用:
static void Main(string[] args) { //User user1 = new User(); //if (!user1.check(1)) //{ // Console.WriteLine("没有查询权限"); // return; //} //order user1_order = new order(); //if (!user1_order.check(1)) //{ // Console.WriteLine("没有找到相关订单"); // return; //} orderSearch ordersearch = new orderSearch(); Console.WriteLine("{0}", ordersearch.check(UserID: 1, orderID: 1) ? "查询成功" : "查询失败"); Console.Read(); }
这里面,无论订单,用户,的工作方法如何变化,BLL只提供一个统一的接口。UI端只负责使用。不去关心内部用的是反射,还是工厂。
如果别的地方也需要使用,直接调用BLL就OK,同时又实现了复用。
总结出两个特性:
1、封装业务逻辑,对外提供统一接口,降低耦合度。
2、单独抽取之后,可供其它地方复用
参考资料:
http://baike.baidu.com/link?url=qjG7xszaQZY455jRuOe9MfOuvvjjopa3K7S9xhuWHXpD2-vTnyTEwmQTcJRnfr1zUldRfSmtbgPKj9BytNhpma
以上是关于外观模式的主要内容,如果未能解决你的问题,请参考以下文章