阅读《大话设计模式》后,自己根据unity的特性写的一个简单demo,如有不妥之处,欢迎评论纠正....
首先贴上书中关于状态模式的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 状态模式
{
public abstract class State
{
public abstract void Handle(Context context);
}
public class ConcreteStateA :State
{
public override void Handle(Context context)
{
context.State = new ConcreteStateB();
}
}
public class ConcreteStateB : State
{
public override void Handle(Context context)
{
context.State = new ConcreteStateA();
}
}
public class Context
{
private State state;
public Context(State state)
{
this.state = state;
}
public State State
{
get { return state; }
set
{
state = value;
Console.WriteLine("当前状态 :" + state.GetType().Name);
}
}
public void Request()
{
state.Handle(this);
}
}
}
客户端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace 状态模式
{
class Program
{
static void Main(string[] args)
{
Context c = new Context(new ConcreteStateA());
c.Request();
c.Request();
c.Request();
c.Request();
c.Request();
Console.ReadKey();
}
}
}
然后下面是我写的使用unity实现状态模式(State mode)的unity代码
State.cs:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class State
{
protected Text mText;
protected Text mBtnText;
protected Image mImage;
public void Init(Transform transform)
{
Button button = transform.Find("Button").GetComponent<Button>();
button.onClick.AddListener(OnClick);
mText = transform.Find("Text").GetComponent<Text>();
mBtnText = transform.Find("Button/Text").GetComponent<Text>();
mImage = transform.Find("Image").GetComponent<Image>();
}
protected virtual void OnClick()
{
}
public virtual void Handle(Context context)
{
}
}
public class Context
{
private State state;
public Context(State state)
{
this.state = state;
}
public State State
{
get { return state; }
set
{
state = value;
Debug.Log("当前状态 :" + state.GetType().Name);
}
}
public State Request()
{
state.Handle(this);
return this.state;
}
}
using UnityEngine;
using System.Collections;
public class ConcreteStateA : State
{
private Transform transform;
public ConcreteStateA(Transform transform)
{
Init(transform);
this.transform = transform;
SetState();
}
public override void Handle(Context context)
{
context.State = new ConcreteStateB(transform);
}
private void SetState()
{
mText.text = "状态A";
mBtnText.text = "状态A按钮";
mImage.color = Color.red;
}
protected override void OnClick()
{
Debug.Log("状态A按钮事件");
}
}
public class ConcreteStateB : State
{
private Transform transform;
public ConcreteStateB (Transform transform)
{
Init(transform);
this.transform = transform;
SetState();
}
public override void Handle(Context context)
{
context.State = new ConcreteStateA(transform);
}
private void SetState()
{
mText.text = "状态B";
mBtnText.text = "状态B按钮";
mImage.color = Color.red;
}
protected override void OnClick()
{
Debug.Log("状态B按钮事件");
}
}
Test.cs
using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour {
void OnGUI()
{
if(GUI.Button(new Rect(100, 100, 100, 40), "控制状态按钮1"))
{
Context c = new Context(new ConcreteStateA(this.transform));
c.Request();
}
if (GUI.Button(new Rect(100, 150, 100, 40), "控制状态按钮2"))
{
Context c = new Context(new ConcreteStateA(this.transform));
c.Request();
c.Request();
}
}
}
运行效果图: