观察者模式
例如:
1.当一个对象管理着两个UI,其中一个UI依赖于另一个UI。将两者封装在独立的对象中以使他们可以各自独立地改变和复用。
2.当一个UI界面发生改变时,需要同时改变另一个uI界面,但是不知道具有改变哪些内容。
3.当一个UI界面必须通知另一个UI界面时,但是它又不能知道其它UI界面是谁。也就是说,降低它们之间的耦合性。
UI管理类UIMgr
publci class UIMgr
{
UILoginView LogonView;
UIMainView Manview;
public UILoginView LogonView{get;set;}
public UIMainView Manview{get;set;}
public void SendMessage()
{
LogonView.SendMessage(this);
Manview.SendMessage(this);
}
}
UI登录界面UILogonView
public class UILogonView:MonoBehaviour
{
string message;
public UILogonView (string _message)
{
message=_message;
}
public void SendMessage(UIMgr magr)
{
Debug.Log(_account+_password);
}
}
UI主界面UIMainView
public class UIMainView :MonoBehaviour
{
string message;
public UIMainView (string _message)
{
message=_message;
}
public void SendMessage(UIMgr magr)
{
Debug.Log(message);
}
}
游戏控制类
publci class GameController:MonoBehaviour
{
public UIMgr UIMgr;
public UILogonView UILogonView;
public UIMainView UIMainView ;
void Awake()
{
UIMgr=new UIMgr();
UILogonView=new UILogonView("登录成功");
UIMainView =new UIMainView ("打开了主界面,关闭了登录界面");
UIMgr.LogonView=UILogonView;
UIMgr.MainView=UIMainView;
UIMgr.SendMessage();
}
}
这里又一个需要我们修复的问题那就是,UILogonView,UIMainView 和UIMgr之间形成了一种双向的依赖关系。也就是说,UILogonView,UIMainView调用了UIMgr类,UIMgr调用了UILogonView,UIMainView的方法。这样违背了开放封闭原则。所以这里我引入了一个抽象类来取消它们之间的依赖关系。
public interface UIBaseView
{
void SendMessage(UIMgr magr)
{
Debug.Log(message);
}
}
publci class UIMgr
{
UIBaseView LogonView; //依赖于接口
UIBaseView Manview;//依赖于接口
public UIBaseView LogonView{get;set;}
public UIBaseView Manview{get;set;}
public void SendMessage()
{
LogonView.SendMessage(this);
Manview.SendMessage(this);
}
}
public class UILogonView:MonoBehaviour, UIBaseView
{
string message;
public UILogonView (string _message)
{
message=_message;
}
public void SendMessage(UIMgr magr)
{
Debug.Log(message);
}
}
public class UIManview: MonoBehaviour,UIBaseView
{
string message;
public UIMainView (string _message)
{
message=_message;
}
public void SendMessage(UIMgr magr)
{
Debug.Log(message);
}
}
这样做虽然很好,但是如果需要对UIMgr进行增加和删除对象呢?所以还需要进行修改的。
在UIMgr里面添加了 观察者列表。如下:
publci class UIMgr
{
List<UIBaseView> BaseViewList=new List<UIBaseView>();
public void SendMessage()
{
foreach(var view in BaseViewList)
{
view.SendMessage(this);
}
}
public void AddView(UIBaseView view)
{
BaseViewList.Add(view);
}
public void RemoverView(UIBaseView view)
{
BaseViewList.Remover(view);
}
}
publci class GameController:MonoBehaviour
{
public UIMgr UIMgr;
public UIBaseView UILogonView;
public UIBaseView UIMainView ;
void Awake()
{
UIMgr=new UIMgr();
UILogonView=new UILogonView("登录成功");
UIMainView =new UIMainView ("打开了主界面,关闭了登录界面");
UIMgr.Add(UILogonView);
UIMgr.Add(UIMainView);
UIMgr.SendMessage();
}
}
到了这里,已经有了观察者的影子了,UIMgr类已经不再依赖于UIMainView或UILogonView,而是依赖于UIBaseView,但是UIMainView或UILogonView却依赖于UIMgr类。所以我们还需要将UIMgr做一次抽象。
publci abstract class UIMgrBase
{
List<UIBaseView> BaseViewList=new List<UIBaseView>();
public void SendMessage()
{
foreach(var view in BaseViewList)
{
view.SendMessage(this);
}
}
public void AddView(UIBaseView view)
{
BaseViewList.Add(view);
}
public void RemoverView(UIBaseView view)
{
BaseViewList.Remover(view);
}
}
publci class UIMgr: UIMgrBase
{
{
public class UILogonView: MonoBehaviour,UIBaseView
{
string message;
public UILogonView (string _message)
{
message=_message;
}
public void SendMessage(UIMgrBase magr)
{
Debug.Log(message);
}
}
public class UIManview: MonoBehaviour,UIBaseView
{
string message;
public UIMainView (string _message)
{
message=_message;
}
public void SendMessage(UIMgrBase magr)
{
Debug.Log(message);
}
}
publci class GameController:MonoBehaviour
{
public UIMgrBase UIMgr;
public UIBaseView UILogonView;
public UIBaseView UIMainView ;
void Awake()
{
UIMgrBase=new UIMgr();
UILogonView=new UILogonView("登录成功");
UIMainView =new UIMainView ("打开了主界面,关闭了登录界面");
UIMgr.Add(UILogonView);
UIMgr.Add(UIMainView);
UIMgr.SendMessage();
}
}

本文探讨了观察者模式在UI管理中的应用,通过逐步抽象和改进,实现了解耦UI组件与管理类,允许UI界面独立变化并响应状态更新,降低了系统的复杂性和耦合度。

被折叠的 条评论
为什么被折叠?



