外观模式(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

 

posted on 2016-05-21 11:36  梦回过去  阅读(255)  评论(0编辑  收藏  举报