用心理解设计模式——外观模式 / 门面模式 (Facade Pattern)

前置文章: 设计模式的原则 

其他设计模式:用心理解设计模式专栏

设计模式相关代码已统一放至 我的 Github

一、定义

  结构型模式之一。

  Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.

  (为子系统中的一组接口提供一个统一的接口。门面模式定义了一个更高层次的接口,使得子系统更为易用。)

二、结构解析

  外观模式的一般结构有两种角色: 子系统、外观。

  子系统(SubSystem),不一定是一个实体类,可能只是一些有关联的模块的集合。对外提供一组可独立使用的接口。

  外观(Facade)将子系统的一组可独立使用的接口,组织封装为一个具有高级功能的接口

三、评价

  外观模式,通过新增一个外观类,解除了客户与子系统的直接耦合(在客户较多、子系统独立功能较多时尤为明显,存在复杂的网状耦合)。 

  外观模式符合迪米特法则,它让客户得以体验一条龙便捷服务,而不用关心细节。比如婚庆包办、一键安装LNMP等。

  外观模式的符合开闭原则,最终新增了一个高级接口,但没有对子系统做任何修改。

using UnityEngine;

namespace Facade
{
    //外观类
    public class Facade
    {
        SubSystem.ModuleA moduleA = new SubSystem.ModuleA();
        SubSystem.ModuleB moduleB = new SubSystem.ModuleB();
        SubSystem.ModuleC moduleC = new SubSystem.ModuleC();

        public void DoSth()
        {
            moduleA.DoSthA();
            moduleB.DoSthB();
            moduleC.DoSthC();
        }
    }

    //子系统,由多个由关联的模块组成而成的一个系统
    public class SubSystem
    {
        public class ModuleA
        {
            public void DoSthA()
            {
                Debug.Log("做A事情");
            }
        }

        public class ModuleB
        {
            public void DoSthB()
            {
                Debug.Log("做B事情");
            }
        }

        public class ModuleC
        {
            public void DoSthC()
            {
                Debug.Log("做C事情");
            }

        }
    }

    public class Client
    {
        static public void Main()
        {
            //new SubSystem.ModuleA().DoSthA();
            //new SubSystem.ModuleB().DoSthB();
            //new SubSystem.ModuleC().DoSthC();

            //使用同一的接口,避免访问子系统的细节模块
            new Facade().DoSth();
        }           
    }
}

猜你喜欢

转载自blog.csdn.net/NRatel/article/details/84539817