装饰模式在unity3d里面的使用

 

修炼装饰外观(门面)模式的心法如下:
1)  外观(门面)角色Façade:客户端可以调用此角色方法。本角色知晓子系统的所有功能和责任。一般情况下本角色没有实际的业务逻辑,只是一个委托类。
2)  子系统角色Subsystem:可以同时又一个或者过个子系统。每个子系统都不是单独的类,而是一个类的集合。子系统并不知道外观(门面)的存在。对于子系统而言,外观(门面)仅仅是另外一个客户端而已。

修炼心法与武功套路的对应:
1)  外观(门面)角色Façade对应武功套路里面的Façade。
2)  子系统角色Subsystem对应武功套路里面的MessageModel、MessageInfo 、UIAnimaiton 、UIAnimationWithMessageInfo、UpLevelController。

上面描述了外观装饰(门面)模式的修炼心法和武功套路。下面就给出具体的套路细节。
建议:看下面代码之前,可以先根据装饰模式的心法及对应的武功套路先行修炼。
外观(门面)角色:


using UnityEngine;
using System.Collections;

namespace Facade
{
/// <summary>
/// 外观(门面)模式里的外观(门面)角色
/// </summary>
public class Facade
{
MessageInfo info;
UIAnimaiton uiAnimation;
UIAnimationWithMessageInfo uiWithInfo;
UpLevelController upLevelController;


public Facade()
{
info = new MessageInfo();
uiAnimation = new UIAnimaiton();
uiWithInfo = newUIAnimationWithMessageInfo();
upLevelController = newUpLevelController();
}

public void ShowInfo(MessageModelmessageModel)
{
info.ShowAllInfo(messageModel);
}

public void Up(float power)
{
upLevelController.UpLevel(power);
}

public void PlayAnimaiton()
{
uiAnimation.PlayAnimationWithEffect();
}

public void StopAnimation()
{
uiAnimation.StopAnimationWithEffect();
}

public void PauseAnimation()
{
uiAnimation.PauseAnimationWithEffect();
}

public void UpAnimation(float power)
{
uiWithInfo.UpLevelWithPlayUIAnimation(power);
}
}
}

子系统角色:


using UnityEngine;
using System.Collections;

namespace Facade
{
#region 子系统相关类
public class MessageModel
{
string name;

public string Name
{
get { return name; }
set { name = value; }
}

string sex;

public string Sex
{
get { return sex; }
set { sex = value; }
}

int level;

public int Level
{
get { return level; }
set { level = value; }
}

float power;

public float Power
{
get { return power; }
set { power = value; }
}
}

public class MessageInfo
{
public void ShowAllInfo(MessageModelinfoModel)
{
Debug.Log(string.Format("姓名:{0}, 性别:{1}, 级别:{2},力量:{3}",infoModel.Name, infoModel.Sex, infoModel.Level, infoModel.Power));
}
}

public class UpLevelController
{
public void UpLevel(float power)
{
if (power > 100)
{
Debug.Log("升级!");
}
}
}

public class UIAnimaiton
{
public void PlayAnimationWithEffect()
{
Debug.Log("播放UI动画!");
}

public void StopAnimationWithEffect()
{
Debug.Log("停止UI动画!");
}

public void PauseAnimationWithEffect()
{
Debug.Log("暂停UI动画");
}
}

public class UIAnimationWithMessageInfo
{
UIAnimaiton uiAnimation;
UpLevelController upLevelController;

public UIAnimationWithMessageInfo()
{
uiAnimation = new UIAnimaiton();
upLevelController = newUpLevelController();
}

public voidUpLevelWithPlayUIAnimation(float power)
{
uiAnimation.PlayAnimationWithEffect();
upLevelController.UpLevel(power);
}
}

#endregion
}

客户端测试类:


using UnityEngine;
using System.Collections;

namespace Facade
{
public class FacadeClient:MonoBehaviour
{
Facade facade;
MessageModel messageModel;

void Start()
{
facade = new Facade();

#region 设置消息模型
messageModel = new MessageModel();
messageModel.Name = "蛮牛";
messageModel.Sex = "男";
messageModel.Level = 10;
messageModel.Power = 200;
#endregion
}

void OnGUI()
{
if(GUILayout.Button("ShowInfo"))
{
facade.ShowInfo(messageModel);
}
if (GUILayout.Button("Up"))
{
facade.Up(101);
}
if(GUILayout.Button("PalyAnimaiton"))
{
facade.PlayAnimaiton();
}
if(GUILayout.Button("StopAnimation"))
{
facade.StopAnimation();
}
if(GUILayout.Button("PauseAnimation"))
{
facade.PauseAnimation();
}
if(GUILayout.Button("UpAnimation"))
{
facade.UpAnimation(101);
}
}
}
}

搞懂了上面的武功心法和武功套路,你也就领悟了装饰模式。正如野猪一直强调的一样,每种武功都有他的优缺点和解决问题的侧重点。So,come on,请往下看:
装饰模式的优点:
1)  减少系统的相互依赖。
2)  依赖减少,提高了灵活性。
3)  由于外观(门面)角色不能参与子系统的具体的业务逻辑,只是提供一个访问子系统的一个路径而已,所以提高了安全性。

装饰模式的缺点:
1)  外观(门面)模式最大的缺点就是不符合开闭原则(OCP)。