当主题里面的消息发生变换,通知所有的观察所含信息发生变更
public interface Subject{
void RegisterObserver(Observes ob);
void RemoveObserver(Observes ob);
void NotifyObserver();
}
using System.Collections;
using System.Collections.Generic;
public class ConcreateSubject : Subject
{
List<Observes> Observes = new List<Observes>();
public Tst type;
public void SetChange(Tst _type)
{
type = _type;
NotifyObserver();
}
public void RegisterObserver(Observes ob)
{
Observes.Add(ob);
}
public void RemoveObserver(Observes ob)
{
Observes.Remove(ob);
}
public void NotifyObserver()
{
for (int i = 0; i < Observes.Count; i++)
{
Observes[i].ChangeType();
}
}
}
public interface Observes{
void ChangeType();
}
using UnityEngine;
using System.Collections;
public class ConcreateObserveWalk :MonoBehaviour, Observes
{
public ConcreateSubject subject;
public void ChangeType()
{
Debug.Log(subject.type);
}
public void Init_Register(ConcreateSubject sub)
{
subject = sub;
subject.RegisterObserver(this);
}
}
using UnityEngine;
using System.Collections;
using DG.Tweening;
public class ConcreateObserveRun :MonoBehaviour, Observes
{
public ConcreateSubject subject;
public Transform Cube;
public void ChangeType()
{
Debug.Log(subject.type);
if (subject.type==Tst.Walk)
{
Cube.DOMove(new Vector3(5f, 0f, 0f), 2f);
}
}
public void Init_Register(ConcreateSubject sub)
{
subject = sub;
subject.RegisterObserver(this);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour {
private Tst type = Tst.Walk;
public ConcreateObserveRun run;
public ConcreateObserveWalk walk;
// Use this for initialization
void Start () {
ConcreateSubject sub = new ConcreateSubject();
run.Init_Register(sub);
walk.Init_Register(sub);
sub.SetChange(type);
}
}
做为一名初学者,有很多地方需要改进,如果大家有更好的实现方式,记得私信我,很多时候真的需要有人点拨一下,发散自己的思维。
需求:ConcreateObserveWalk,ConcreateObserveRun,需要继承Mono behaviour类。