C# 设计模式———外观(门面)模式

外观模式简介

要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供了一个高层次的接口,使得子系统更易于使用。
在这里插入图片描述

为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。

C# 外观模式Demo

在这里插入图片描述

using System;

namespace FacadePattern
{
    class Program
    {
        static void Main(string[] args)
        {
            FruitMarker fruitMarker = new FruitMarker();
            fruitMarker.BuyApple();
            fruitMarker.BuyOrange();
            fruitMarker.BuyPeach();
            fruitMarker.BuyAllFruit();
        }
    }

    public abstract class Fruit
    {
        public abstract void BuyFruit();
    }

    public class Orange : Fruit
    {
        public override void BuyFruit()
        {
            Console.WriteLine("买了一个橘子");
        }
    }

    public class Apple : Fruit
    {
        public override void BuyFruit()
        {
            Console.WriteLine("买了一个苹果");
        }
    }

    public class Peach : Fruit
    {
        public override void BuyFruit()
        {
            Console.WriteLine("买了一个桃子");
        }
    }

    /// <summary>
    /// 封装的门面类,包含上述子类
    /// </summary>
    public class FruitMarker
    {
        private Fruit apple;
        private Fruit orange;
        private Fruit peach;

        public FruitMarker()
        {
            apple = new Apple();
            orange = new Orange();
            peach = new Peach();
        }

        public void BuyApple()
        {
            apple.BuyFruit();
        }
        public void BuyOrange()
        {
            orange.BuyFruit();
        }

        public void BuyPeach()
        {
            peach.BuyFruit();
        }

        public void BuyAllFruit()
        {
            peach.BuyFruit();
            orange.BuyFruit();
            apple.BuyFruit();
        }
    }
}

测试结果:
在这里插入图片描述
说明:
由上例可以看出:通过外观模式,可以方便得将多个子系统聚合成一个外观类,通过访问外观类则可实现对各个子系统开放出来的方法进行调用,隐藏了子系统的内部复杂性,也提高了用户的易用型。

Unity 外观模式Demo

用一个按钮实现红绿灯的切换;
在这里插入图片描述
ButtonController.cs 绑定在Button上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ButtonController : MonoBehaviour
{
    public GameObject redLight;
    public GameObject greenLight;

    private bool isRed = true;
    private Button controlButton;
    // Start is called before the first frame update
    void Start()
    {
        controlButton = GetComponent<Button>();
        controlButton.onClick.AddListener(OnClickControlButton);
    }


    #region function
    /// <summary>
    /// 外观模式
    /// </summary>
    private void OnClickControlButton()
    {
        isRed = !isRed;
        if (isRed) OpenRedLight();
        else OpenGreenLight();
    }

    private void OpenRedLight()
    {
        redLight.SetActive(true);
        greenLight.SetActive(false);
    }

    private void OpenGreenLight()
    {
        redLight.SetActive(false);
        greenLight.SetActive(true);
    }

    #endregion
}

参考资料

https://www.runoob.com/design-pattern/facade-pattern.html
https://www.bilibili.com/video/av83017932?p=14

发布了18 篇原创文章 · 获赞 17 · 访问量 2693

猜你喜欢

转载自blog.csdn.net/chasinghope/article/details/104218863