外觀模式簡介
要求一個子系統的外部與其內部的通信必須通過一個統一的對象進行。門面模式提供了一個高層次的接口,使得子系統更易於使用。
爲子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。 | |
---|---|
降低訪問複雜系統的內部子系統時的複雜度,簡化客戶端與之的接口。 | |
---|---|
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
更多: