首页 > 其他分享 >我学设计模式 之 观察者模式

我学设计模式 之 观察者模式

时间:2022-12-16 16:33:55浏览次数:36  
标签:void 主题 观察者 System 我学 using 设计模式 public


  

观察者(Observer)模式

1. 观察者模式介绍

       观察者模式是对象行为模式,又叫做发布-定义模式、模型-视图模式、源-监听器模式或从属者模式。

 

       观察者模式定会以了一种一对多的依赖关系,让多个观察者同事监听一个主题对象,这个主题在状态发生变化是,会通知所有观察者对象,使他们能够自动跟新自己。

 

2.观察者模式的结构

 

l         抽象主题(Subject)角色:主题角色把所有对观察者对象的引用保存在一个聚集(List)中,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,主题角色又叫做抽象被观察着角色,一般用一个抽象类或者一个接口实现

 

l         抽象观察者(Observer)角色:为所有具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口又叫做更新借口。抽象观察者角色一般用一个抽象类或一个接口实现。

 

l         具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象;在具体的主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察着角色。

 

       具体观察者(ConcreteObserver)角色:存储于主题状态自恰的状态。具体观察者角色实现抽象观察者角色所要求更新接口,以便使本身的状态与主题的状态相协调

 

3. 使用观察者模式关闭winform颜色

Winform使用观察者模式改变窗体背景颜色,效果图如下:

 

 

 

点击窗体1、窗体2,将显示窗体1和窗体2,点击红色、蓝色,窗体1和窗体2同事改变相应的颜色,如同系统皮肤实现。

以下是具体的实现:

1.       创建观察者:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ObserverForm
{
/// <summary>
/// 观察者接口
/// </summary>
public interface IObserver
{
void changeColor(string
}
}

 

 

2.       创建抽象主题:Iobservable.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ObserverForm
{
/// <summary>
/// 主题接口
/// </summary>
public interface IObservable
{
void add(IObserver
void remove(IObserver
void change(string
}
}

这个抽象接口定义了3个方法子类必须实现的操作,add()用来添加一个观察者对象,remove用来删除一个已经登记过的观察者对象;而change()用来通知各个观察者更新他们自己。

       现在抽象主题、抽象观察者都已存在,剩下就该创建具体主题和具体观察者了。具体主题实现了抽象主题Iobservable接口的一个类,他给出了以上的三种方法的具体实现,如下,创建一个Form实现MainForm.cs实现Iobserverable.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ObserverForm
{
/// <summary>
/// 主题form
/// </summary>
public partial class MainForm : Form,IObservable
{
private List<IObserver> observersList = new List<IObserver>();

public
{
InitializeComponent();
}

public void add(IObserver
{
observersList.Add(o);
}

public void remove(IObserver
{
observersList.Remove(o);
}

public void change(string
{
foreach (IObserver o in
{
o.changeColor(color);
}
}

private void button1_Click(object sender, EventArgs
{
Form1 f1 = new Form1();
observersList.Add(f1);
f1.Show();
}

private void button2_Click(object sender, EventArgs
{
Form2 f2 = new Form2();
observersList.Add(f2);
f2.Show();
}

private void button3_Click(object sender, EventArgs
{
this.change("红色");
}

private void button4_Click(object sender, EventArgs
{
this.change("绿色");
}

 

抽象观察者的具体实现最为简单,在此处只需实现一个方法,在此例子中有两个观察者他们只需实现此接口即可。具体实现如下:

观察者1

/// <summary>
/// 观察者form1
/// </summary>
public partial class Form1 : Form,IObserver
{
public
{
InitializeComponent();
}

public void changeColor(string
{
if(str == "红色")
this.BackColor = Color.Red;
if (str == "绿色")
this.BackColor = Color.Blue;
}
}

 

观察者2:

/// <summary>
/// 观察者form2
/// </summary>
public partial class Form2 : Form,IObserver
{
public
{
InitializeComponent();
}

public void changeColor(string
{
if (str == "红色")
this.BackColor = Color.Red;
if (str == "绿色")
this.BackColor = Color.Blue;
}
}

 

 

4.使用事件与委托改进观察者模式改变窗体winform颜色:

       在C#中,确切的说事在.Net框架中,关于事件与委托的处理采用了观察者模式。由于委托与接口的差别,利用事件与委托在解耦性方面具有一定的优势。以下将引入事件与委托机制对上面进行改进:

/// <summary>
/// 观察者
/// </summary>
/// <param name="color"></param>
public delegate void ChangeCorlorHandler(string);
/// <summary>
/// 主题
/// </summary>
public class Subject
{
public static event ChangeCorlorHandler

public static void ChangeColor(String
{
if (eventChanageColor != null)
eventChanageColor(color);
}
}

 

/// <summary>
/// 主题form
/// </summary>
public partial class MainForm : Form
{
public
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs
{
Form1 f1 = new Form1();
f1.Show();
}

private void button2_Click(object sender, EventArgs
{
Form2 f2 = new Form2();
f2.Show();
}

private void button3_Click(object sender, EventArgs
{
Subject.ChangeColor("红色");
}

private void button4_Click(object sender, EventArgs
{
Subject.ChangeColor("绿色");
}
}

 

    /// <summary>

    /// 观察者form1

    /// </summary>

    public partial class Form1 : Form

    {

        public

        {

            InitializeComponent();

            Subject.eventChanageColor += new ChangeCorlorHandler(ChangeColor);

        }

 

        public void ChangeColor(string

        {

            if(str == "红色")

                this.BackColor = Color.Red;

            if (str == "绿色")

                this.BackColor = Color.Blue;

        }

 

    }

 

/// <summary>
/// 观察者form2
/// </summary>
public partial class Form2 : Form
{
public
{
InitializeComponent();
Subject.eventChanageColor += new ChangeCorlorHandler(ChangeColor);
}

public void ChangeColor(string
{
if (str == "红色")
this.BackColor = Color.Red;
if (str == "绿色")
this.BackColor = Color.Blue;
}
}

 


 

 

 

 

 

 

 

 

 

 

 

 

 

标签:void,主题,观察者,System,我学,using,设计模式,public
From: https://blog.51cto.com/u_15739274/5947793

相关文章

  • 程序设计模式急救笔记
    打完游戏发现考试内容一点没看,紧急抢救,精神状态不甚正常,慎读。例子有的不是很好,为了考试的时候抄个UML图方便罢了。0.UML图1.关联关系类A用到了类B,A->B类A用到了类B......
  • 说说设计模式~ 观察者模式与消费者模式的区别
    ​​返回目录​​再说概念这两个模式确实有点相似,都为了实现程序的解耦产生的,观察者一般又称发布/订阅模式,它一般是有一个主题对象,然后有多个订阅者去关注它,当它的状态发生......
  • 行为型:设计模式之解释器模式(二十二)
     虽然目前计算机编程语言有好几百种,但有时候我们还是希望能用一些简单的语言来实现一些特定的操作,我们只要向计算机输入一个句子或文件,它就能够按照预先定义的文法规则来对......
  • 行为型:设计模式之迭代器模式(二十一)
     20世纪80年代,那时我家有一台“古老的”电视机,牌子我忘了,只记得是台黑白电视机,没有遥控器,每次开关机或者换台都需要通过电视机上面的那些按钮来完成,我印象最深的是那个用来......
  • 【设计模式】行为型模式之命令模式
    三个角色命令发出者,命令,命令执行者解决的问题降低命令发出者和命令执行者之间的耦合度理解假设在饭店的场景下,服务员(命令发出者)会把客人点的菜写在一张纸上(......
  • 结构型:设计模式之适配器模式(六)
    20V,而我国的家庭用电是220V,如何让20V的笔记本电脑能够在220V的电压下工作?答案是引入一个电源适配器(ACAdapter),俗称充电器或变压器,有了这个电源适配器,生活用电和笔记本电脑......
  • 创建型:设计模式之建造模式(四)
     没有人买车会只买一个轮胎或者方向盘,大家买的都是一辆包含轮胎、方向盘和发动机等多个部件的完整汽车。如何将这些部件组装成一辆完整的汽车并返回给用户,这是建造者模式需......
  • 设计模式 学习目的 举例:装饰器模式和代理模式
    1.装饰器模式和代理模式  2.学习目的 ......
  • Datawhale组队学习——大话设计模式Task01学习笔记
    闲言碎语有次和学长闲聊提到了设计模式,也推荐了一个B站的视频。然后也一直忙别的事情始终没有好好学习一下。恰逢学期末有时间,datawhale又出了这门新教程,便一起学习下,看看......
  • 发布订阅模式和观察者模式
    1.发布/订阅模式订阅者发布者信号中心假定,存在一个"信号中心",某个任务执行完成,就向信号中心"发布"(publish)一个信号,其他任务可以向信号中心"订阅"(subsc......