游戏设计模式——观察者模式(Observer)


观察者模式

定义:
在对象之间定义一个一对多的连接方法,当一个对象变换状态时,其他关联的对象都会自动收到通知。
社交网站就会最佳的观察者模式实例。当我们在社交网站上,与另一位用户成为好友、加入一个粉丝团或关注另一位用户的状态,
那么当这些好友、粉丝团、用户有任何的新的动态或动态变动时,就会在我们动态页面上“主动”看到这些对象更新的情况,
而不必到每一位好友或粉丝团中查看。

观察者模式的优点

观察者的设计原理是,先设置一个主题,让这个主题发布时可同时通知关心这个主题的观察者/订阅者,并且主题不必理会观察者/订阅者,接下来会执行哪些操作。其优点就是将 主题发生 和 功能执行 这两个操作解除绑定——消除依赖性,而且对于“执行者(观察者/订阅者)”来说,还是可以动态决定是否要执行后续的功能。

观察者模式的缺点

可能造成过多的观察者类,不过利用注册“回调函数”来取代“注册类对象”可有效减少累的产生。

下面是栗子?

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

namespace Leon_Observer
{
//观察者界面
public abstract class Leon_Observer
{
public abstract void Update();
}

//主题界面
public abstract class Subject
{
List<Leon_Observer> m_Observers = new List<Leon_Observer>();

//加入观察者
public void Attach(Leon_Observer theObserver)
{
m_Observers.Add(theObserver);
}

//移除观察者
public void Detach(Leon_Observer theObserver)
{
m_Observers.Remove(theObserver);
}

//通知所有观察者
public void Notify()
{
foreach (Leon_Observer theObserver in m_Observers)
theObserver.Update();
}
}

//主题实际操作
public class ConcreteSubject : Subject
{
string m_SubjectState;
public void SetState(string State)
{
m_SubjectState = State;
Notify();
}

public string GetState()
{
return m_SubjectState;
}
}

//实际操作的Observer1
public class ConcreteObserver1 : Leon_Observer
{
string m_ObjectState;

ConcreteSubject m_Subject = null;

public ConcreteObserver1(ConcreteSubject theSubject)
{
m_Subject = theSubject;
}

//通知Subject更新
public override void Update()
{
Debug.Log("ConcreteObserver1.Update");
//取得Subject状态
m_ObjectState = m_Subject.GetState();
}

public void ShowState()
{
Debug.Log("ConcreteObserver1:Subject目前的主题:" + m_ObjectState);
}
}

//实际操作的Observer2
public class ConcreteObserver2 : Leon_Observer
{
ConcreteSubject m_Subject = null;

public ConcreteObserver2(ConcreteSubject theSubject)
{
m_Subject = theSubject;
}

//通知Subject更新
public override void Update()
{
Debug.Log("ConcreteObserver2.Update");
//取得Subject状态
Debug.Log("ConcreteObserver2:Subject目前的主题:" + m_Subject.GetState());
}
}
}

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

public class Leon_ObserverTest : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
UnitTest();
}

private void UnitTest()
{
//主题
ConcreteSubject theSubject = new ConcreteSubject();

//加入观察者
ConcreteObserver1 theObserver1 = new ConcreteObserver1(theSubject);
theSubject.Attach(theObserver1);
theSubject.Attach(new ConcreteObserver2(theSubject));

//设定Subject
theSubject.SetState("Subject状态1");

//显示状态
theObserver1.ShowState();
}
}

原创:https://www.panoramacn.com
源码网提供WordPress源码,帝国CMS源码discuz源码,微信小程序,小说源码,杰奇源码,thinkphp源码,ecshop模板源码,微擎模板源码,dede源码,织梦源码等。

专业搭建小说网站,小说程序,杰奇系列,微信小说系列,app系列小说

游戏设计模式——观察者模式(Observer)

免责声明,若由于商用引起版权纠纷,一切责任均由使用者承担。

您必须遵守我们的协议,如果您下载了该资源行为将被视为对《免责声明》全部内容的认可-> 联系客服 投诉资源
www.panoramacn.com资源全部来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。 敬请谅解! 侵权删帖/违法举报/投稿等事物联系邮箱:2640602276@qq.com
未经允许不得转载:书荒源码源码网每日更新网站源码模板! » 游戏设计模式——观察者模式(Observer)
关注我们小说电影免费看
关注我们,获取更多的全网素材资源,有趣有料!
120000+人已关注
分享到:
赞(0) 打赏

评论抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

您的打赏就是我分享的动力!

支付宝扫一扫打赏

微信扫一扫打赏