设计模式--观察者模式

来源:互联网 发布:大连 知乎 编辑:程序博客网 时间:2024/06/06 12:44

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象。

游戏中UI消息通知。原来事老大写好框架直接用。今天看了一下最基本的。各种语言都适用。

//开发中需要观察者的地方很多。

观察者抽象基类。//需要关心某事的对象。

public abstract class Observer {

    protected string name;
    public Observer(string name) {
        this.name = name;
    }
    public abstract void Updatedo();
    
}

//具体观察者类。实现得到消息的方法

public class PlayerUI : Observer
{
    public PlayerUI(string name) : base(name)
    {
    }
    public override void Updatedo()
    {
        Debug.Log("获取消息。更新角色面板统计数据");
    }
}

// 被观察的对象。主题接口

 interface  Subject {
    void Trigger();
    void AddObserver(Observer ob);
    void RomveObserver(Observer ob);  
}

//具体主题

public class SubServer : MonoBehaviour,Subject {
    //维护一个列表保存所有观察者
    List<Observer> obs = new List<Observer>(); 
    public void AddObserver(Observer ob)
    {
        obs.Add(ob);
    }
    public void RomveObserver(Observer ob)
    {
        obs.Remove(ob);
    }
   public void Trigger()
    {
        for (int i = 0; i < obs.Count; i++)
        {
            obs[i].Updatedo();
        }
    }
    // Use this for initialization
    void Start()
    {
        //注册观察者
        TitleUI tiobs = new TitleUI("5杀");
        PlayerUI plobs = new PlayerUI("5杀");
        AddObserver(tiobs);
        AddObserver(plobs);
        Trigger();
    }
}

//这个就是SubServer 发送一条全局消息。某人5杀了。客户端界面需要显示5杀消息。数据统计界面需要更新杀人记录。等等。

我觉得c#的Action也是一个观察者

using UnityEngine;
using System.Collections;
using System;


public class ActionObserver : MonoBehaviour {


// Use this for initialization
void Start () {
        AObserver.obser += UpdateUI;
    }


    // Update is called once per frame
    void UpdateUI(string mes)
    {
        Debug.Log("接收到消息");
    }
}
public class ActionObserverTrriger : MonoBehaviour
{


    // Use this for initialization
    void Start()
    {
        if (AObserver.obser!= null)
        {
            AObserver.obser("消息内容");//触发
        }
    }
   
    // Update is called once per frame
    void Update()
    {
       
    }
}
public class AObserver {
    //
   public static  Action<string> obser;
}


//然后想要项目中实际使用还是不够。我一般使用插件。或者框架中有的。



0 0