观察者模式详细解答

共四个类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
///
/// 发布信息类
///
//Observer:观察者
//Publisher:发布者
//Listener:监听者
//EventArge:发布信息
namespace ObserverDemo3
{//放发布者所发布的信息
class EventArge
{ //定义一个只读字段
public readonly string Message;
//赋值方法:在它的构造函数中给它赋值
//构造函数给它一个参数string
//当实例化发布信息对象时给它赋值,实例化对象时会调用构造函数,把构造函数的值赋值给只读字段(发布的信息)
public EventArge(string s)
{
Message = s;
}
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
///
/// 发布者的类
///
namespace ObserverDemo3
{
class Publisher
{
//委托和事件写在发布者类里
//定义一个委托
//给它的参数中,第一个给它的东西是发布者发布的信息,
//发布的信息在发布信息类中,在这个类中的Message字段,定义一个EventArge的对象,
//为什么要定义一个EventArge对象?因为给字段Message赋值是在实例化对象的时候赋值
//第二个参数时发布者
//发布者不就是这个类吗,为什么还要定义一个?因为一会儿在调用的时候就是用的this
//(发布的信息 发布者 )
//一会儿要在Main函数中调用,所以要公开(类外调用类内的要公开)
public delegate void EventHandle(EventArge e, object o);
//定义一个事件
public event EventHandle Myevent;
//再写一个方法,执行里面的东西
public void Function(EventArge e)
{//如果它不为空就执行这个事件
if (Myevent != null)
{//这个事件是EventHandle这个委托,委托里需要两个参数,
//意味着我这个方法也要给它两个参数,但第二个是发布者,现在把这个东西写到发布者类里面了,所以只需要写一个参数就行
//第一个参数是发布信息类,第二个是发布者,发布者就是this
//this就是当前这句话所在的类里面(当前发布者所在的地方)
Myevent(e, this);
}
}
//调用Function这个方法
//Function方法中有EventArge这个参数
//这个时候发布的信息,需要传进一个EventArge这个对象
//(new EventArge())是我要发布的信息,但是我发布的信息建立它对象的时候,
//构造函数里给了一个string类型参数,所以在写这个的时候,里边是要给它一个参数的,所以在Fun里写一个参数
//在调用Fun这个方法的时候,就把我要发布的信息传进来,然后传给Fun这个方法,Fun这个方法再传给EventArge这个类
//实例化对象的时候,e(我要发布的信息就有了),这时如果时间不为空,就会执行这个事件

    public void Fun(string message)
    {
        Function(new EventArge(message));
    }
}

}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
///
/// 监听者的类
///
namespace ObserverDemo3
{
//监听类是当发生某件事情的时候我做出什么样的反应
//做出的反应要付给委托
//最好写成静态的,因为不用实例化对象,直接用类名.就可以调用了
class Listener
{
//定义:因为作出的反应最终是要赋给委托的,所以定义这个方法的时候同样它的返回类型,参数类型都必须跟委托是一致的
public static void MyFun(EventArge e,object o)
{ //Message就是发布的信息
//当发布者发布什么信息时,监听者接收到了什么信息

        Console.WriteLine("老师说:"+e.Message+"终于可以玩了");
    }
    public static void MyFunction(EventArge e, object o)
    {
        Console.WriteLine("老师说:" + e.Message + "别再玩了");
    }
}

}

主函数:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
///
/// 观察者
///
namespace ObserverDemo3
{
class Program
{
static void Main(string[] args)
{
//实例化发布者这个类
Publisher p = new Publisher();
//我从控制台输入什么东西,输入不同的东西应该做出不同的反应
string s = Console.ReadLine();//读取从控制台输入的东西
if (s==“下课了”)
{
//给事件赋值,赋值的是委托对象
//方法一:直接把方法给事件
p.Myevent += Listener.MyFun;
//方法二:委托对象是new Publisher.EventHandle(Listener.MyFun);
//p.Myevent += new Publisher.EventHandle(Listener.MyFun);
//因为委托是方法的集合,事件是委托的集合,也是一种特殊的委托;
//给委托赋值时其实就是把方法给它,而给事件赋值时,我们也可以直接把方法给它,直接Listener.MyFun
}
if (s==“上课了”)
{
p.Myevent+= new Publisher.EventHandle(Listener.MyFunction);
}
//调用Fun这个方法,把信息给它,给事件传进一个string类型的参数,这就是我从控制台出入的东西
p.Fun(s);
Console.ReadKey();
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值