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
更多:

23種設計模式C#

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章