前言:笔者在最开始写程序的时候经常会遇到一种情况,例如更改一个字段、或者添加一种小功能,就要把原来写过的东西几乎废弃掉,或者更改大量以前写过的代码。又或者自己写的东西时间久了再去回顾,完全找不到到时为什么这么写的头绪,如果遇到了Bug更是无法快速定位在哪里小范围出现的问题。如果你也经常遇到这种问题,就说明你现阶段非常需要学习下设计模式了。
在网上经常说的设计模式有23种,也有一些更多的设计模式,无非也是从这些设计模式中变种而来。如果让笔者来形容什么是设计模式,我认为设计模式是:一种思想,一种模式,一种套路,一种解决问题的高效策略。
有说的不正确或者不准确的地方欢迎留言指正
有什么有趣的写作技巧或者想法欢迎大家给我留言,大家的帮助是我写下去最有效的动力
Youtube、微博等社交媒体可能是大家生活中必不可少的东西,在遇到自己感兴趣的东西或者Up主总会忍不住关注一波,每当自己关注的UP主更新动态时,对应的关注者也会受到对应的更新推送,这样就不会错过感兴趣的第一手资料。这种模式在设计模式中也有类似的应用,那就是今天笔者要说的观察者模式。
观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
话不多少,示例走起、
首先定义一个类似于UP主、频道这种性质的接口
public interface ISubject
{
void NotifyObservers();
void RegisterObserver(IObserver observer);
}
然后定义各位吃瓜群众的观察者接口
public interface IObserver
{
void Update(string tag);
}
Unity频道具体实现类
public class UnitySubject : ISubject
{
private IList<IObserver> observerList = new List<IObserver>();
private string tag = "";
public string Tag
{
get { return tag; }
set { tag = value; }
}
public void NotifyObservers()
{
for (int i = 0; i < observerList.Count; i++)
{
observerList[i].Update(tag);
}
}
public void RegisterObserver(IObserver observer)
{
observerList.Add(observer);
}
}
各位吃瓜群众
public class HaiLanZero : IObserver
{
public void Update(string tag)
{
this.Log($"{nameof(HaiLanZero)}---收到信息---{tag}");
}
}
public class HaiLanOne : IObserver
{
public void Update(string tag)
{
this.Log($"{nameof(HaiLanOne)}---收到信息---{tag}");
}
}
public class HaiLanTwo : IObserver
{
public void Update(string tag)
{
this.Log($"{nameof(HaiLanTwo)}---收到信息---{tag}");
}
}
调用
using ObserverPattern;
using UnityEngine;
public class ObserverComponent : MonoBehaviour
{
void Start()
{
Initialized();
}
public void Initialized()
{
UnitySubject unitySubject = new UnitySubject();
IObserver haiLanZero = new HaiLanZero();
IObserver haiLanOne = new HaiLanOne();
IObserver haiLanTwo = new HaiLanTwo();
unitySubject.RegisterObserver(haiLanZero);
unitySubject.RegisterObserver(haiLanOne);
unitySubject.RegisterObserver(haiLanTwo);
unitySubject.Tag = "Unity频道更新视频啦";
unitySubject.NotifyObservers();
}
}
这样我们只要属性已更新,就可以让订阅频道的吃瓜群众第一时间接收到信息了
在开发过程中,我们应该会更熟悉另一种实现方式,那就是事件啦,我们就先简单的改装下
笔者记得有一次开发中用到观察者模式是在界面刷新的时候,这个刷新界面有时候是更换字体、皮肤主题、或者对应的内容。只要点击应用,所有的打开的界面都会更换。
观察者模式在实际开发中应用的地方还是很广泛的,只要需求有一对多、能灵活的增减订阅,减少耦合度,都可以考虑使用观察者模式。
这里我们可以下思考一下
- 根据参数Tag不同,我们是不是可以在对应的Observer实例里面采用不同的行为方式呢?
- 如果这个Tag不是string,而是泛型或者object呢?参数范围扩大是不是让我们能做的事更多了呢 ?
- 吃瓜群众对应的更新函数Update是不是也可以在多个Up主或者频道中订阅呢?
网友评论