【设计模式】使用unity实现代理模式(Proxy mode)

 

demo下载地址 : https://github.com/Eagle-Lai/DesignMode/tree/master/Proxy


阅读《大话设计模式》后,自己根据unity的特性写的一个简单demo,如有不妥之处,欢迎评论纠正....


先贴上书中的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 代理模式
{
    public abstract class Subject
    {
        public abstract void Request();
    }

    public class RealSubject : Subject 
    {
        public override void Request()
        {
            Console.WriteLine("真实的请求!!!");
        }
    }

    class Proxy : Subject 
    {
        private RealSubject realSubject;

        public override void Request()
        {
            if(realSubject == null)
            {
                realSubject = new RealSubject();
            }

            realSubject.Request();
        }
    }
}

客户端代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 代理模式
{
    class Program
    {
        static void Main(string[] args)
        {
            Proxy proxy = new Proxy();
            proxy.Request();

            Console.ReadKey();
        }
    }
}


然后下面是自己根据书中的思路实现的代理模式的代码,能够代理Text, Button, Image等组件的功能:


UIView.cs

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System;

public class UIView  {
    private Text mText;
   // private Button mButton;
    private Text mBtnText;
    private Image mImage;

    private Action Callback;

    public UIView() { }


    public void Init(Transform transform, Action callback, Color imageColor, string txt = "", string btnTxt = "")
    {
        InitUI(transform);
        SetText(txt);
        SetBtnText(btnTxt);
        SetImage(imageColor);
        Callback = callback;
    }

    private void InitUI(Transform transform)
    {
        mText = transform.Find("Text").GetComponent<Text>();
        Button mButton = transform.Find("Button").GetComponent<Button>();
        mBtnText = transform.Find("Button/Text").GetComponent<Text>();
        mImage = transform.Find("Image").GetComponent<Image>();

        mButton.onClick.AddListener(onClick);
    }

    private void onClick()
    {
        if(Callback != null)
        {
            Callback();
        }
    }

    private void SetText(string txt)
    {
        mText.text = txt;
    }

    private void SetBtnText(string txt)
    {
        mBtnText.text = txt;
    }

    private void SetImage(Color color)
    {
        mImage.color = color;
    }
}

ProxyUIView.cs

using UnityEngine;
using System.Collections;
using System;
public class ProxyUIView
{
    public static void Proxy(Transform transform, Color imageColor, Action callback, string txt = "", string btnTxt = "")
    {
        UIView v = new UIView();
        v.Init(transform, callback, imageColor, txt, btnTxt);
    }
}


Test.cs:

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

	void OnGUI()
    {
        if(GUI.Button(new Rect(100, 100, 120,50), "代理者"))
        {
            ProxyUIView.Proxy(this.transform, Color.green, Callback, "代理者", "代理者按钮");
        }
    }
     
    private void Callback()
    {
        print("代理成功");
    }
}



只要把test.cs挂到canvas上即可。
运行效果,点击button就会log出内容






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值