设计模式 --- 外观模式

外观模式是一种结构型设计模式,为复杂子系统提供​​统一的高层接口​​,通过定义一个外观类来​​简化客户端与子系统的交互​​,降低系统耦合度。这种模式隐藏了子系统的复杂性,将客户端与子系统的实现细节隔离开来,让客户端只需与外观类交互即可完成复杂的操作。

优点:

1.简化接口:客户端只需与外观类交互,无需了解子系统的复杂接口和实现细节,降低了客户端的使用难度。

2.降低耦合度:将客户端与子系统隔离开来,使得子系统的变化不会影响到客户端,提高了系统的可维护性和可扩展性。

3.提高灵活性:可以根据需要添加或修改外观类的方法,而不会影响到子系统的实现。

缺点:

1.不符合开闭原则 :如果需要添加新的子系统功能,可能需要修改外观类的代码,这违反了开闭原则。

优化:提供扩展方法或钩子方法

2.外观类可能过于庞大 :当子系统的功能越来越多,外观类的方法也会越来越多,导致外观类变得庞大和复杂。

优化:分拆为多个子外观类。

cs 复制代码
// 基础层
class CoreFacade {
    protected DatabaseService _db = new DatabaseService();
    protected CacheService _cache = new CacheService();
}

// 扩展层(继承复用)
class BusinessFacade : CoreFacade {
    private AnalyticsService _analytics = new AnalyticsService();
    
    public void ProcessOrder(Order order) {
        _cache.Store(order);
        _db.Save(order);
        _analytics.Track(order);
    }
}

说明例子:

1.UML类图

2.实现

1.定义一个外观类:

cs 复制代码
    public class AppFacadePattern
    {
        private GameEventSys m_gameEventSys = null;
        private CampSys m_campSys = null; 

        public void Initinal()
        {
            m_gameEventSys = new GameEventSys();
            m_campSys = new CampSys();
        }

        public void Update()
        {
            m_gameEventSys.Update();
            m_campSys.Update();
        }
    }

2.定义一个基础系统类以及两个实际系统类:

cs 复制代码
    public class BaseSys
    {
        public virtual void Update()
        {
            
        }
    }

    public class GameEventSys : BaseSys
    {
        public override void Update()
        {
            Debug.Log("GameEventSys Update");
        }
    }

    public class CampSys : BaseSys
    {
        public override void Update()
        {
            Debug.Log("CampSys Update");
        }
    }

3.测试类:

cs 复制代码
public class AppFacade : MonoBehaviour
{
    AppFacadePattern appFacade = null;
    void Start()
    {
        appFacade = new AppFacadePattern();
        appFacade.Initinal();
    }

    void Update()
    {
        appFacade?.Update();   
    }
}

游戏中的使用场景:

1.游戏资源加载与管理 :游戏里需要加载各种各样的资源(像图片、音频、模型等),可能涉及不同的加载器、缓存机制等。

2.游戏输入管理 :游戏中的输入方式多种多样,比如键盘、鼠标、手柄等,不同的输入设备有不同的处理逻辑,而且还可能存在不同的输入模式(如菜单模式、游戏模式等)。

3.游戏特效管理 :游戏中常常会有各种特效,如粒子特效、光影特效、音效特效等。每种特效都有其独特的创建、播放和销毁逻辑。

4.游戏网络通信管理 :游戏中的网络通信涉及多个方面,例如连接服务器、发送和接收数据、处理网络错误等。这些操作可能较为复杂,并且不同的网络协议和服务器有不同的实现方式。

5.新手引导系统 :​引导流程需要控制UI提示、镜头移动、操作锁定等多个模块。

6.存档/读档系统​ :玩家数据保存涉及角色状态、任务进度、地图探索等多个子系统。

7.场景加载管理器​ :场景加载涉及资源加载、光照烘焙、物理系统初始化等多个子系统。

8.战斗系统封装​ :角色攻击需要协调动画、伤害计算、特效、音效等多个模块​​​​​​​。

9.动态难度调整​:难度平衡涉及敌人属性、掉落率、AI行为等多个参数。

总结:

通过合理应用外观模式,可以显著提升 C# 项目的可维护性和架构清晰度,特别是在处理复杂系统集成第三方库封装或跨团队协作场景中效果显著。

参考书籍:

《Hands-On Game Development Patterns with Unity 2019》

《设计模式与游戏完美开发》

相关推荐
~山有木兮25 分钟前
C++设计模式 - 单例模式
c++·单例模式·设计模式
周某某~1 小时前
四.抽象工厂模式
java·设计模式·抽象工厂模式
钢铁男儿1 小时前
C# 表达式和运算符(表达式和字面量)
开发语言·c#
勤奋的知更鸟2 小时前
Java编程之组合模式
java·开发语言·设计模式·组合模式
哆啦A梦的口袋呀2 小时前
基于Python学习《Head First设计模式》第九章 迭代器和组合模式
python·学习·设计模式
林鸿群2 小时前
C#子线程更新主线程UI及委托回调使用示例
开发语言·c#
o0向阳而生0o2 小时前
63、.NET 异常处理
c#·.net·异常处理
on the way 1232 小时前
行为型设计模式之Mediator(中介者)
java·设计模式·中介者模式
周某某~4 小时前
二.单例模式‌
java·单例模式·设计模式
SteveDraw5 小时前
C++动态链接库封装,供C#/C++ 等编程语言使用——C++动态链接库概述(总)
开发语言·c++·c#·封装·动态链接库