这次是DesignMode系列的第四期,是书上第七章,关于代理模式的讲解,依然使用unity来写这个实例。目的–我想改变一个UItext的值,但是我不想被UItext知道,所以我请一个代理来帮我做这件事。
使用软件Visual Studio2013,Unity3D。
打开Unity3D新建项目,新建C#脚本IChangeText类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//定义接口,使得我和代理都能有这个功能
interface IChangeText
{
string ChangeText();
}
再新建三个类分别为WantToChangeTex
using System;
using System.Collections;
using System.Collections.Generic;
//定义text,我要修改的text
public class WantToChangeText
{
private string text;
public string Text
{
get { return text; }
set
{
text = value;
}
}
}
ThisIsMe类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//定义我,我有改遍text的功能
public class ThisIsMe:IChangeText
{
//引用改变的text类
WantToChangeText wantToChangeText;
//构造方法,引用代理的实例
public ThisIsMe(WantToChangeText wantToChangeText)
{
this.wantToChangeText = wantToChangeText;
}
//我间接改变UItext
public string ChangeText()
{
wantToChangeText.Text = "ThisIsMe Changed byProxy";
return wantToChangeText.Text;
}
}
ThisIsProxy类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//代理类,实现接口
public class ThisIsProxy : IChangeText
{
private ThisIsMe me;
//实例化我
public ThisIsProxy(WantToChangeText wantToChangeText)
{
me = new ThisIsMe(wantToChangeText);
}
//代理引用我的方法改变文字,并且返回
public string ChangeText()
{
return me.ChangeText();
}
}
最后定义一个类继承MonoBeahavior,用来挂载在游戏物体上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MainTool : MonoBehaviour
{
//在组件面板把textUI拖上去
public Text textUI;
void Start()
{
//实例化改变的文字
WantToChangeText wantToChangeText = new WantToChangeText();
wantToChangeText.Text = textUI.text;
//通过代理改变文字
ThisIsProxy proxy = new ThisIsProxy(wantToChangeText);
string newText = proxy.ChangeText();
//跟新UI
textUI.text = newText;
}
}
控制台输出显示:
代理大概就是这样一个原理,在这里我为了实现一个很小的功能,却用了大量的代码,看似很不值得,但是有的时候一个良好的代码在不知不觉中,会让你很舒服。