demo下载地址: https://github.com/Eagle-Lai/DesignMode/tree/master/Strategy
阅读《大话设计模式》后,自己根据unity的特性写的一个简单demo,如有不妥之处,欢迎评论纠正....
这只是一个简单的demo,并没有那些AI行为等等相关更加复杂的多种策略,将就的看看就行,体会其中的设计思想。
首先是贴出书中,关于策略模式(strategy)的简介:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
然后下面是书中实现策略模式的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 策略模式
{
abstract class Strategy
{
public abstract void AlgorithmInterface();
}
class ConcreteStrategyA : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("AAAAAAAAA");
}
}
class ConcreteStrategyB : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("BBBBBBBBB");
}
}
class ConcreteStrategyC : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("CCCCCCCCC");
}
}
class Context
{
Strategy strategy;
public Context (Strategy strategy)
{
this.strategy = strategy;
}
public void ContextInterface()
{
strategy.AlgorithmInterface();
}
}
}
客户端的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 策略模式
{
class Program
{
static void Main(string[] args)
{
Context c1 = new Context(new ConcreteStrategyA());
c1.ContextInterface();
Context c2 = new Context(new ConcreteStrategyB());
c2.ContextInterface();
Context c3 = new Context(new ConcreteStrategyC());
c3.ContextInterface();
Console.ReadKey();
}
}
}
然后下面贴出我自己使用unity实现的策略模式的代码:
Strategy.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI ;
using System;
public class Strategy
{
public Text mText;
public Button mButton;
public Text mBtnText;
public Strategy strategy;
public Strategy() { }
public Strategy( Strategy strategy)
{
this.strategy = strategy;
}
public void Init(Transform transform)
{
mText = transform.Find("Text").GetComponent<Text>();
mButton = transform.Find("Button").GetComponent<Button>();
mBtnText = mButton.transform.Find("Text").GetComponent<Text>();
mButton.onClick.AddListener(OnClick);
}
public virtual void OnClick()
{
}
public virtual void ConcreteStrategy()
{
OnClick();
}
}
ConcreteStrategy.cs
using UnityEngine;
using System.Collections;
public class ConcreteStrategyA : Strategy
{
public override void ConcreteStrategy()
{
base.ConcreteStrategy();
mText.text = "这个是策略A";
mBtnText.text = "策略A";
}
public override void OnClick()
{
Debug.Log("ButtonA");
}
}
public class ConcreteStrategyB : Strategy
{
public override void ConcreteStrategy()
{
base.ConcreteStrategy();
mText.text = "这个是策略B";
mBtnText.text = "策略B";
mBtnText.color = Color.red;
}
public override void OnClick()
{
Debug.Log("ButtonB");
}
}
public class ConcreteStrategyC : Strategy
{
public override void ConcreteStrategy()
{
base.ConcreteStrategy();
mText.text = "这个是策略C";
mBtnText.text = "策略C";
mBtnText.color = Color.green;
}
public override void OnClick()
{
Debug.Log("ButtonC");
}
}
Context.cs
using UnityEngine;
using System.Collections;
public class Context
{
public Strategy strategy;
public Context(Strategy strategy,Transform transform)
{
this.strategy = strategy;
this.strategy.Init(transform);
}
public void ConcreteStrategy()
{
strategy.ConcreteStrategy();
}
}
Test.cs
using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour {
void OnGUI()
{
if(GUI.Button(new Rect(100,100,200,100),"策略A"))
{
Context c1 = new Context(new ConcreteStrategyA(),this.transform);
c1.ConcreteStrategy();
}
if (GUI.Button(new Rect(100, 200, 200, 100), "策略B"))
{
Context c1 = new Context(new ConcreteStrategyB(), this.transform);
c1.ConcreteStrategy();
}
if (GUI.Button(new Rect(100, 300, 200, 100), "策略C"))
{
Context c1 = new Context(new ConcreteStrategyC(), this.transform);
c1.ConcreteStrategy();
}
}
}
只需要把Test.cs挂到Canvas上就可以了
运行的效果图: