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中的委托事件模型

事件源对象充当观察目标角色,委托对象充当抽象观察者角色,事件处理对象充当具体观察者角色

如果事件源对象的某个事件触发,则调用事件处理对象中的事件处理程序来对事件进行处理

模式优点

可以实现表示层和数据逻辑层的分离

在观察目标和观察者之间建立一个抽象的耦合

支持广播通信,简化了一对多系统设计的难度

符合开闭原则,增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便

模式缺点

没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,

而只是知道观察目标发生了变化

委托的绑定和解绑,容易忘记

使用环境

一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两个方面封装在独立的对象中使它们可以各自独立地改变和复用

一个对象的改变将导致一个或多个其他对象发生改变,且并不知道具体有多少对象将发生改变,也不知道这些对象是谁

需要在系统中创建一个触发链

玩家和血量和信息变化,联动UI一起产生变化

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通...
    扈扈哈嘿阅读 5,163评论 0 12
  • 观察者模式是使用最为频繁的设计模式之一。在很多地方都有用到。比如各种编程语言的GUI事件处理实现,各种框架的实现,...
    树獭非懒阅读 15,724评论 1 7
  • 面向对象的六大原则 单一职责原则 所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于...
    JxMY阅读 4,522评论 1 3
  • 【学习难度:★★★☆☆,使用频率:★★★★★】直接出处:观察者模式梳理和学习:https://github.com...
    BruceOuyang阅读 5,507评论 1 5
  • 长长,长长的天在我的睫毛间在我微微眯着的眼睛里还有啾啾啾啾鸟儿交织的鸣叫啊散在这片远远,远远的天 把月亮叫醒又迂回...
    葺宝阅读 3,021评论 0 1

友情链接更多精彩内容