外观模式 - Unity

外观模式

外观模式是对象结构型模式,也叫门面模式,负责为多个复杂系统提供一个对外一致的接口,使得这些子系统可以更容易本人使用,同时也隔绝了客户端的直接调用,对于复杂系统来说,使用者没有深入了解这些系统,随意调用容易造成错误。通过外观模式将这些子系统的功能进行封装,从而可以使客户端简单的使用。

绝大多数框架和软件都会进行外观模式的封装,使用户不会看到内部的实现,只留一些常用的按钮或接口提供给开发者或使用者。即减少使用者对子系统学习的成本,也避免了因为使用不当,而造成的错误。

使用外观模式,将众多子系统全部封装,留一个接口,接口里只有一些用户常用的功能即可。这样的做法大大降低的客户端和系统直接的耦合。

结构

在这里插入图片描述
说明

  • Facade(外观)- 为众多子系统提供统一接口。客户端之间与外观类打交道,从而便捷的访问子系统。本身子系统不会察觉到外观类的存在。
  • SubSystem(子系统)- 实现系统的功能。本身不与客户端直接接触。客户端也可以直接访问子系统,但需要深入了解实现的细节,和相应的执行顺序。

实现

我举一个机甲的例子

引擎 - 子系统1

    public class Engine
    {
        public void StartUp()
        {
            Debug.Log("启动---");
        }

        public void Move()
        {
            Debug.Log("移动中---");
        }
    }

机枪 - 子系统2

    public class MachineGun
    {
        public void Shooting()
        {
            Debug.Log("射击---");
        }
    }

防御装置 - 子系统3

    public class DefensiveDevice
    {
        public void Defense()
        {
            Debug.Log("防御中---");
        }
    }

机甲类 - 门面类

    /// <summary>
    /// 机甲类(Facade 类)
    /// </summary>
    public class Mech
    {
        private Engine _engine;
        private MachineGun _gun;
        private DefensiveDevice _defensiveDevice;

        public Mech()
        {
            _engine = new Engine();
            _gun = new MachineGun();
            _defensiveDevice = new DefensiveDevice();
        }

        public void Start()
        {
            _engine.StartUp();
        }

        public void MoveAndShooting()
        {
            _engine.Move();
            _gun.Shooting();
        }

        public void MoveAndDefense()
        {
            _engine.Move();
            _defensiveDevice.Defense();
        }
    }

调用

    public class FacadeExample : MonoBehaviour
    {
        private void Start()
        {
            Mech mech = new Mech();
            
            //启动
            mech.Start();
            
            //移动射击
            mech.MoveAndShooting();
            
            //移动防御
            mech.MoveAndDefense();
        }
    }

在这里插入图片描述
外观类本身作为子系统的调用者,容易变的臃肿。我们可以分解外观类,来降低类的复杂。

应用场景

  • 当子系统十分复杂时,客户端需要的功能较少时,使用外观类将客户端的功能封装,并以接口的形式提供给客户端。
  • 当子系统组织为多层结构,也可以使用门面模式
  • 若客户端与许多系统关联,我们需要引入外观模式,将他们分离。防止出错。

利与弊

优点

  • 客户端无需和复杂系统打交道,降低客户端复杂性,也降低客户端出错的可能性和学习成本。

缺点

  • 外观类拥有过多的子系统引用,容易称为上帝对象。

与其他模式比较

外观创建接口,适配器改变已有接口,装饰增强接口,代理使用原有接口。

外观是即创建对象,也实现对应功能,抽象工厂是对一系列的对象的创建,不负责实现功能

外观模式可以使用单例,因为外观通常只有一个。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值