设计模式-------观察者模式

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

观察者模式

例如:
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();
  }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值