摘錄自:設計模式與游戲完美開發
十年磨一劍,作者將設計模式理論巧妙地融入到實踐中,以一個游戲的完整實現呈現設計模式的應用及經驗的傳承 《軒轅劍》之父——蔡明宏、資深游戲制作人——李佳澤、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();
}
}