设计模式笔记之 观察者模式

 

2008110214275061.png

2010030711001489.png

代码:

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

namespace ObserverPattern
{
class Program
{
static Subject subject=new Subject();//一个被观察者


static void Main(string[] args)
{
ObserverDispalyInfor oneObserverDisplayInfor
= new ObserverDispalyInfor();
ObserverForecast oneObserverForecast
= new ObserverForecast();

subject.RegisterObserver(oneObserverDisplayInfor);
//布告观察者注册
subject.RegisterObserver(oneObserverForecast);//天气预报观察者注册

subject.GetChange(
12, 23, 34);

subject.RemoveRegisterObserver(oneObserverDisplayInfor);
//布告观察者离开了

subject.GetChange(
12, 23, 666);



}
}

/// <summary>
/// 被观察者接口
/// </summary>
public interface ISubject
{
void RegisterObserver(IObserver observer);
void RemoveRegisterObserver(IObserver observer);
void Notify();
}

/// <summary>
/// 观察者接口
/// </summary>
public interface IObserver
{
void Updata(int temperature,int humidity,int pressure);
}

/// <summary>
/// 布告板的显示动作接口
/// </summary>
public interface IDisplay
{
void DisPlay();
}


/// <summary>
/// 被观察者类
/// </summary>
public class Subject
{
List
<IObserver> observerList;

private int temperature;
private int humidity;
private int pressure;


public Subject()
{
this.observerList = new List<IObserver>();
}

/// <summary>
/// 注册一个观察者
/// </summary>
/// <param name="observer"></param>
public void RegisterObserver(IObserver observer)
{
this.observerList.Add(observer);
Console.Write(observer.ToString()
+ "注册了,热烈欢迎\r\n");
Console.Read();
Console.Read();
}

/// <summary>
/// 去掉一个注册者
/// </summary>
/// <param name="observer"></param>
public void RemoveRegisterObserver(IObserver observer)
{
foreach (IObserver oneObserver in this.observerList)
{
if (oneObserver == observer)
{
this.observerList.Remove(observer);
Console.Write(observer.ToString()
+ "走了,希望以后还有合作的机会\r\n");
Console.Read();
Console.Read();
break;
}
}
}

/// <summary>
/// 通知观察者方法
/// </summary>
public void Notify()
{
Console.Write(
"参数发生了变化,我要通知给观察者\r\n");
Console.Read();
Console.Read();

foreach (IObserver oneObserver in this.observerList)
{
oneObserver.Updata(
this.temperature,this.humidity,this.pressure);
}
}

/// <summary>
/// 改变状态
/// </summary>
public void GetChange(int temperature,int humidity,int pressure)
{
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;


this.Notify();//通知观察者
}


}

/// <summary>
/// 布告观察者
/// </summary>
public class ObserverDispalyInfor:IObserver,IDisplay
{
private int temperature;
private int humidity;
private int pressrue;

private DateTime notifyTime;

public ObserverDispalyInfor()
{
this.notifyTime = new DateTime();
}



public void Updata(int temperature, int humidity, int pressure)
{
this.temperature = temperature;
this.humidity = humidity;
this.pressrue = pressure;

this.notifyTime = DateTime.Now;

this.DisPlay();
}

public void DisPlay()
{
Console.Write(
"----" + this.ToString() + "接受到了新消息-----\r\n");

System.Console.Write(
"气象部门" + this.notifyTime.ToString() + "发布的消息\r\n"
+"温度:"+this.temperature.ToString()
+"\r\n湿度:"+this.humidity.ToString()
+"\r\n压力:"+this.pressrue.ToString());

Console.Read();
Console.Read();

}
}

/// <summary>
/// 天气预报观察者
/// </summary>
public class ObserverForecast : IObserver, IDisplay
{
private int temperature;
private int humidity;
private int pressrue;
private bool rain;




public void Updata(int temperature, int humidity, int pressure)
{
this.temperature = temperature;
this.humidity = humidity;
this.pressrue = pressure;

this.DisPlay();

}

/// <summary>
/// 天气预报观察者利用被观察者通知得到的信息计算出是不是要下雨
/// </summary>
private void Calculate()
{
if (this.temperature + this.humidity + this.pressrue > 100)
{
this.rain = true;
}
else
{
this.rain = false;
}
}

public void DisPlay()
{
this.Calculate();

string temp = string.Empty;
if (this.rain)
{
temp
= "下雨了,打雷收衣服啊\r\n";
}
else
{
temp
= "今天天气不错,风和日丽的\r\n";
}
Console.Write(
"----"+this.ToString() + "接受到了新消息-----\r\n");
System.Console.Write(temp);
Console.Read();
Console.Read();

}
}
}

 

运行后:

2008102613362125.png

转载于:https://www.cnblogs.com/zzy0471/archive/2008/10/26/1319803.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值