外观模式(Facade pattern)

外观模式(Facade pattern):为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
动机
将一个系统划分成为若干个子系统有利于降低系统的复杂性。一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小。达到该目标的途径之一是就是引入一个外观(facade)对象,它为子系统中较一般的设施提供了一个单一而简单的界面。

外观模式(Facade pattern)_第1张图片

结构


参与者
Facade

——知道哪些子系统类负责处理请求。
——将客户的请求代理给适当的子系统对象。
Subsystem classes 
——实现子系统的功能。
——处理由facade对象指派的任务。
——没有facade的任何相关信息;即没有指向facade的指针。(单向的)
效果
1)它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便;
2)它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。 Facade模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。Facade模式可以消除复杂的循环依赖关系。
实现

1)降低客户——子系统之间的耦合度 用抽象类实现Facade而它的具体子类对应于不同的子系统实现,这可以进一步降低客户与子系统的耦合度。另一种方法是用不同的子系统对象配置Facade对象。
2)公共子系统类与私有子系统类。

参考代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyFacade
{
    class SubSystemOne
    {
        public void MethodOne()
        {
            Console.WriteLine("Subsystem method one.");
        }
    }

    class SubSystemTwo
    {
        public void MethodTwo()
        {
            Console.WriteLine("Subsystem method two.");
        }
    }

    class SubSystemThree
    {
        public void MethodThree()
        {
            Console.WriteLine("Subsystem method three.");
        }
    }

    class Facade
    {
        private SubSystemOne one;
        private SubSystemTwo two;
        private SubSystemThree three;

        public Facade()
        {
            one = new SubSystemOne();
            two = new SubSystemTwo();
            three = new SubSystemThree();
        }

        public void MethodA()
        {
            Console.WriteLine("Facade method A");
            one.MethodOne();
            three.MethodThree();
        }

        public void MethodB()
        {
            Console.WriteLine("Facade method B");
            two.MethodTwo();
            three.MethodThree();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyFacade
{
    class Program
    {
        static void Main(string[] args)
        {
            Facade facade = new Facade();
            facade.MethodA();
            facade.MethodB();

            Console.ReadKey();
        }
    }
}
相关模式

Mediator模式与Facade模式的相似之处是,它抽象了一些已有的类的功能。然而,Mediator的目的是对同事之间的任意通讯进行抽象,通常集中不属于任何单个对象的功能。Mediator的同事对象知道中介者并与它通信,而不是直接与其他同类对象通信。相对而言,Facade模式仅对子系统对象的接口进行抽象,从而使它们更容易使用;它并不定义新功能,子系统也不知道facade的存在。

中介者模式结构



你可能感兴趣的:(外观模式(Facade pattern))