一、发布订阅模式和观察者模式
前提摘要:学习unity教程时了解到一个设计模式:发布者订阅者模式。感觉与学校讲的观察者模式很相似,在本片文章中阐述一些个人理解,以备后续自己的能力提升。
1、定义一个交互事件 :public event EventHandler OnInteractAction;//交互事件触发
在awake函数中进行行为事件的使用:
gameControl.Player.Interact.performed += Interact_Performed;//行为的事件
+=后直接点击tab键生成一个方法。
?.的意思是:在调用invoke方法之前会判断这个事件(OnInteractAction)是否为空,只有不为空的情况下才会执行invoke函数中的代码。
2、观察者模式
个人理解:在游戏世界中,可能一个物体改变,其他物体也要对应着跟着改变。如:马路上红路灯自己变化,可其余的所有车辆却要跟着变化。一个杀人犯杀了人,导致一大堆警察的出动。
多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。(网上的定义)
但进行游戏开发中,要注意解耦合和松耦合,所以观察者模式和发布订阅模式,从我个人角度来看,还是有一定的区别的。
在观察者模式中,如果一个系统中的数据有更新,那么这个系统中的方法(负责改变数据)就会被调用,在这个方法中进行数据的更新就可以了,可这样耦合度高,比较麻烦。
解决方法:可以把被观察者看作为一个集合,对被观察者实现一个相同的接口。观察者只需要知道,在通知被观察者时具体使用哪一个通知接口就可以了。
3、发布订阅模式
也许和观察者模式相似,发布者有变化时就会去通知订阅者,但我个人看来并不是这样的。发布者和订阅者之间其实是有一个被忽略的中间人,发布者与订阅者之间是并不认识的。
二者之间的中间人可以不是一个,我们可以把中间人理解成不同的方法。
例如:订阅者1号需要购房,则对接的是房屋的中介。订阅者2号需要吃饭,则对接的是饭店的中介。当发布者产生新的变化时,根据不同的订阅者需求,调用不同的中间人即可,不需要发布者与订阅者沟通(这里要看功能的具体实现)。
4、简单的从三个方面总结一下
(1)观察者模式是观察者与被观察者这两个角色、而发布订阅模式是发布者、中间人、订阅者三个角色。
(2)观察者模式我个人认为是耦合度低,适合松耦合。而发布订阅模式是不存在耦合的情况。
仅个人对知识的理解,如有异议,欢迎指正与讨论。
二、单例模式
1、好处是:可以全局随处调用。坏处是:过度使用代码的耦合度高,容易造成逻辑混乱。
2、示例:public static DialogueUI Instance { get; private set; }
一般在awake函数中使用
private void Awake()
{
Instance = this;
}