摘录自:设计模式与游戏完美开发
十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合式的项目教学,即以一个游戏的范例来应用23种设计模式的实现贯穿全书,让读者学习到整个游戏开发的全过程和作者想要传承的经验,并以浅显易懂的比喻来解析难以理解的设计模式,让想深入了解此领域的读者更加容易上手。
工程GitHub
using UnityEngine;
using System.Collections.Generic;
namespace DesignPattern_Observer
{
// 观察这抽象类
public abstract class Observer
{
public abstract void Update();
}
// 主要中介
public abstract class Subject
{
List<Observer> m_Observers = new List<Observer>();
// 加入观察者
public void Attach(Observer theObserver)
{
m_Observers.Add( theObserver );
}
// 移除观察者
public void Detach(Observer theObserver)
{
m_Observers.Remove( theObserver );
}
// 通知所有观察者
public void Notify()
{
foreach( 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 : 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 : Observer
{
string m_ObjectState;
ConcreteSubject m_Subject = null;
public ConcreteObserver2( ConcreteSubject theSubject)
{
m_Subject = theSubject;
}
// 通知Subject更新
public override void Update ()
{
Debug.Log("ConcreteObserver2.Update");
// 取得Subject状态
m_ObjectState = m_Subject.GetState();
}
public void ShowState()
{
Debug.Log("ConcreteObserver2:Subject目前的主題:" + m_ObjectState);
}
}
}
using UnityEngine;
using System.Collections;
using DesignPattern_Observer;
public class ObserverTest : MonoBehaviour
{
void Start()
{
UnitTest();
}
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();
}
}