用心理解设计模式——外观模式 / 门面模式 (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();
        }           
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NRatel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值