C#实现23种设计模式之-观察者模式

观察者模式

处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,观察者模式也被称为发布/订阅模式

观察者模式写法

一、接口

  1. 抽取出一个IOberserver接口
/// <summary>
/// 抽取出一个接口
/// </summary>

public interface IOberserver
{
    void Invoke();
}
  1. 被观察者类实现,通知到继承IObersever接口的所有观察者。将观察者对象放入IOberserver集合中。将集合中的对象foreach调用
/// <summary>
/// 被观察者
/// </summary>

public class Subject
{
    /// <summary>
    /// 实现的具体操作方法
    /// </summary>
    public void Func()
    {
        Console.WriteLine("目标发送信息");
        //通知到继承IOberserver的所有类
        foreach (Observer observer in _oberserverList)
        {
            observer.Invoke();
        }          
    }
​
    public List<IOberserver> _oberserverList = new List<IOberserver>();
​
    public void Add(IOberserver oberserver)
    {
        _oberserverList.Add(oberserver);
    }
​
    public void Remove(IOberserver oberserver)
    {
        _oberserverList.Remove(oberserver);
    }
}
  1. 观察者类的实现,继承IOberserver接口,实现Invoke方法
/// <summary>
/// 观察者类,继承IOberserver接口,实现Invoke方法
/// </summary>

public class Observer : IOberserver
{
    /// <summary>
    /// 实现的接口方法
    /// </summary>
    public void Invoke()
    {
        this.Observe();
    }
​
    /// <summary>
    /// 观察者的操作或响应
    /// </summary>
    public void Observe()
    {
        Console.WriteLine("正在观察中");
    }
}
  1. Main方法
static void Main(string[] args)
{
   Subject subject = new Subject();
   Observer observer = new Observer();
   subject.Add(observer);
   subject.Func();
   Console.ReadKey();
}

二、事件

使用事件去处理,与这个案例类似(发送者相当于主窗体,接受者相当于从窗体)。 其中观察者相当于发送者,被观察者相当于接受者

  1. 被观察者类
/// <summary>
/// 被观察者
/// </summary>

public class Subject
{
    //定义触发事件
    public event Action InvokeEvent;
    
    /// <summary>
    /// 实现的具体操作方法
    /// </summary>
    public void Func()
    {
        Console.WriteLine("目标发送信息"); 
        //事件不为NULL才触发
        if (InvokeEvent != null)
        {
            InvokeEvent.Invoke();
        }
    }   
}
  1. 观察者类中定义与事件签名相同的响应方法
/// <summary>
/// 观察者类
/// </summary>

public class Observer
{
    /// <summary>
    /// 观察者的操作或响应
    /// </summary>
    public void Observe()
    {
        Console.WriteLine("正在观察中");
    }
}
  1. Main方法使用,观察者订阅被观察者的事件。触发事件
static void Main(string[] args)
{
    Subject subject = new Subject();
    Console.WriteLine("==================第二种写法使用事件=================");
    //观察者订阅被观察者的事件
    subject.InvokeEvent += new Observer().Observe;
    //触发事件
    subject.Func();
    Console.ReadLine();
}
image.png
觉得有帮助可以投喂下博主哦~感谢!
作者:Lincol
本文链接:https://www.lincol29.cn/observepattern
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0协议转载请注明文章地址及作者哦~

评论

  1. xyz
    Windows Chrome
    2 周前
    2024-5-16 13:22:30

    希望可以继续更新后面的设计模式。加油 😱

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇