【设计模式】使用unity实现策略模式(strategy model)

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上就可以了


运行的效果图:







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值