设计模式-外观模式的简单实现

外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

模式优点:

  • 它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易

  • 它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可

  • 一个子系统的修改对其他子系统没有任何影响,而且子系统的内部变化也不会影响到外观对象

模式缺点:

  • 不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性

  • 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则

模式适用环境:

  • 要为访问一系列复杂的子系统提供一个简单入口

  • 客户端程序与多个子系统之间存在很大的依赖性

  • 在层次化结构中,可以使用外观模式的定义系统中每一层的入口,层与层之间不直接产生联系,而是通过外观类建立联系,降低层之间的耦合度

UML
设计模式-外观模式的简单实现_第1张图片

外观模式原型

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

public class FacadePrototype : MonoBehaviour
{
     
    // Start is called before the first frame update
    void Start()
    {
     
     
        Facade facade = new Facade();
        facade.SystemFunctionA();
        facade.SystemFunctionB();
        facade.SystemFunctionC();
    }

    // Update is called once per frame
    void Update()
    {
     
  
    }
}

public class Facade
{
     
    private SystemA systemA;
    private SystemB systemB;
    private SystemC systemC;
    public Facade()
    {
     
        systemA = new SystemA();
        systemB = new SystemB();
        systemC = new SystemC();

    }

    public void SystemFunctionA()
    {
     
        systemA.SystemFunction();
    }
    public void SystemFunctionB()
    {
     
        systemB.SystemFunction();
    }
    public void SystemFunctionC()
    {
     
        systemC.SystemFunction();
    }
}

public class ISystem
{
     
    public virtual void SystemFunction() {
      }
}
public class SystemA : ISystem
{
     
    public override void SystemFunction()
    {
     
        base.SystemFunction();
        Debug.Log("执行系统A功能");//系统功能可能需要依赖一个或多个子系统提供

    }
}
public class SystemB : ISystem
{
     
    public override void SystemFunction()
    {
     
        base.SystemFunction();
        Debug.Log("执行系统B功能");
    }
}
public class SystemC : ISystem
{
     
    public override void SystemFunction()
    {
     
        base.SystemFunction();
        Debug.Log("执行系统C功能");

    }
}

简单demo
demo:手机开通套餐
20元套餐(30条短信 100M流量 100分钟通话)
30元套餐(50条短信 200M流量 150分钟通话)
50元套餐(100条短信 500M流量 200分钟通话)

消息

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

public class SMS
{
     
   public void SMS_30()
    {
     
        Debug.Log("30条短信");
    }
    public void SMS_50()
    {
     
        Debug.Log("50条短信");
    }
    public void SMS_100()
    {
     
        Debug.Log("100条短信");
    }
}

流量

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

public class Flow 
{
     
    public void Flow_100()
    {
     
        Debug.Log("100M流量");
    }
    public void Flow_200()
    {
     
        Debug.Log("200M流量");
    }
    public void Flow_500()
    {
     
        Debug.Log("500M流量");
    }
}

通话时间

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

public class CallTime 
{
     
    public void Call_100()
    {
     
        Debug.Log("通话100分钟");
    }
    public void Call_150()
    {
     
        Debug.Log("通话150分钟");
    }
    public void Call_200()
    {
     
        Debug.Log("通话200分钟");
    }
}

手机套餐外观类

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

public class PhoneFacade 
{
     
    private SMS sMS;
    private Flow flow;
    private CallTime callTime;
    public PhoneFacade()
    {
     
        sMS = new SMS();
        flow = new Flow();
        callTime = new CallTime();
    }

   public void SetMial_20()//20元套餐接口
    {
     
        Debug.Log("开通20元套餐");
        sMS.SMS_30();
        flow.Flow_100();
        callTime.Call_100();
    }
    public void SetMial_30()//30元套餐接口
    {
     
        Debug.Log("开通30元套餐");
        sMS.SMS_50();
        flow.Flow_200();
        callTime.Call_150();
    }

    public void SetMial_50()//50元套餐接口
    {
     
        Debug.Log("开通50元套餐");
        sMS.SMS_100();
        flow.Flow_200();
        callTime.Call_150();
    }
}

调用类测试

using System.Colections;
using System.Collections.Generic;
using UnityEngine;

public class User : MonoBehaviour
{
     
    void Start()
    {
     
        PhoneFacade phoneFacade = new PhoneFacade();
        phoneFacade.SetMial_20();
        Debug.Log("******************************************");
        phoneFacade.SetMial_30();
        Debug.Log("******************************************");
        phoneFacade.SetMial_50();
    }
}

设计模式-外观模式的简单实现_第2张图片

你可能感兴趣的:(设计模式)