Unity高阶-游戏常用设计模式-观察者模式
交通信号灯与汽车示意图
交通信号灯 ? ? 观察目标
汽车(汽车驾驶员) ? ?观察者
软件系统:一个对象的状态或行为的变化将导致其他对象的状态或行为也发生改变,它们之间将产生联动
观察者模式:
定义了对象之间一种一对多的依赖关系,让一个对象的改变能够影响其他对象
发生改变的对象称为观察目标,被通知的对象称为观察者
一个观察目标可以对应多个观察者
定义:定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新。对象行为型模式
别名
发布-订阅(Publish/Subscribe)模式
模型-视图(Model/View)模式
源-监听器(Source/Listener)模式
从属者(Dependents)模式
观察者模式包含以下4个角色:
Subject(目标)
ConcreteSubject(具体目标)
Observer(观察者)
ConcreteObserver(具体观察者)
典型的抽象目标类代码:
using System.Collection
abstract class Subject
{
//定义一个观察者集合用于存储所有观察者对象
protected ArrayList observers = new ArrayList();
//声明抽象注册方法,用于向观察者集合中增加一个观察者
public abstract void Attach(Observer observer);
//声明抽象注销方法,用于在观察者集合中删除一个观察者
public abstract void Detach(Observer observer);
//声明抽象通知方法
public abstract void Notify();
}
典型的具体目标类代码:
class ConcreteSubject : Subject
{
public override void Attach(Observer observer)
{
observers.Add(observer);
}
public override void Detach(Observer observer)
{
observers.Remove(observer);
}
//实现通知方法
public override void Notify()
{
//遍历观察者集合,调用每一个观察者的响应方法
foreach(object obs in observers)
{
((Observer)obs).Update();
}
}
}
典型的抽象观察者代码:
interface Observer
{
void Update();
}
典型的具体观察者代码:
class ConcreteObserver : Observer
{
//实现响应方法
public void Update()
{
//具体更新代码
}
}
典型的客户端代码片段:
……
Subject subject = new ConcreteSubject();
Observer observer = new ConcreteObserver();
subject.Attach(observer);
subject.Notify();
……
注意
有时候在具体观察者类ConcreteObserver中需要使用到具体目标类ConcreteSubject中的状态(属性),会存在关联或依赖关系
如果在具体层之间具有关联关系,系统的扩展性将受到一定的影响,增加新的具体目标类有时候需要修改原有观察者的代码,在一定程度上违背了开闭原则,但是如果原有观察者类无须关联新增的具体目标,则系统扩展性不受影响
观察者模式与.NET中的委托事件模型
事件源对象充当观察目标角色,委托对象充当抽象观察者角色,事件处理对象充当具体观察者角色
如果事件源对象的某个事件触发,则调用事件处理对象中的事件处理程序来对事件进行处理
模式优点
可以实现表示层和数据逻辑层的分离
在观察目标和观察者之间建立一个抽象的耦合
支持广播通信,简化了一对多系统设计的难度
符合开闭原则,增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便
模式缺点
没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,
而只是知道观察目标发生了变化
委托的绑定和解绑,容易忘记
使用环境
一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两个方面封装在独立的对象中使它们可以各自独立地改变和复用
一个对象的改变将导致一个或多个其他对象发生改变,且并不知道具体有多少对象将发生改变,也不知道这些对象是谁
需要在系统中创建一个触发链
【Unity高阶-游戏常用设计模式-观察者模式】玩家和血量和信息变化,联动UI一起产生变化
推荐阅读
- 游戏IP(立足于玩家情感的粉丝经济)
- 人生游戏--是游戏,还是人生()
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- (小说)月流水几亿的火爆游戏养成记
- 游戏治愈了我无聊之症
- Unity和Android通信系列文章2——扩展UnityPlayerActivity
- 生活与游戏日记(第182篇)(〔成长瞬间〕关注解决问题2019.10)
- 我妈让我不要玩游戏多做点事
- unity探究UGUI的Image中sprite和overrideSprite的区别
- 牛逼!C++开发的穿越丛林真人游戏,游戏未上线就有百万人气