观察者模式
2015-05-29 20:51
204 查看
观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 观察者模式
{
abstract class Observer //观察者
{
public abstract void Update();
}
abstract class Subject
{
private IList<Observer> observers = new List<Observer>();
public void Attach(Observer o)
{
observers.Add(o);
}
public void Detach(Observer o)
{
observers.Remove(o);
}
public void Notify()
{
foreach (Observer o in observers) //给所有登记过的观察者发出通知
{
o.Update();
}
}
}
class ConcreteSubject : Subject
{
private string state; //主题状态变化
public string State
{
get { return state; }
set { state=value;}
}
}
class ConcreateObserver : Observer
{
private string name;
private string Obstate;
private ConcreteSubject subject;
public ConcreateObserver(ConcreteSubject su, string name)
{
this.subject = su;
this.name = name;
}
public override void Update()
{
Obstate = subject.State; //使本事状态和主题的状态相协调
Console.WriteLine("观察者{0}的新状态是{1}",name,Obstate);
}
public ConcreteSubject Subject
{
get { return subject;}
set{subject=value;}
}
}
class Program
{
static void Main(string[] args)
{
ConcreteSubject s = new ConcreteSubject();
s.Attach(new ConcreateObserver(s,"x"));
s.Attach(new ConcreateObserver(s, "y"));
s.State = "ABC";
s.Notify();
}
}
}
观察者模式的关键对象是主题Subject和观察者Observer,一个Subject可以有任意数目的Oberver,一旦Subject的状态发生变化,所有的
Oberver都可以得到通知。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 观察者模式
{
abstract class Observer //观察者
{
public abstract void Update();
}
abstract class Subject
{
private IList<Observer> observers = new List<Observer>();
public void Attach(Observer o)
{
observers.Add(o);
}
public void Detach(Observer o)
{
observers.Remove(o);
}
public void Notify()
{
foreach (Observer o in observers) //给所有登记过的观察者发出通知
{
o.Update();
}
}
}
class ConcreteSubject : Subject
{
private string state; //主题状态变化
public string State
{
get { return state; }
set { state=value;}
}
}
class ConcreateObserver : Observer
{
private string name;
private string Obstate;
private ConcreteSubject subject;
public ConcreateObserver(ConcreteSubject su, string name)
{
this.subject = su;
this.name = name;
}
public override void Update()
{
Obstate = subject.State; //使本事状态和主题的状态相协调
Console.WriteLine("观察者{0}的新状态是{1}",name,Obstate);
}
public ConcreteSubject Subject
{
get { return subject;}
set{subject=value;}
}
}
class Program
{
static void Main(string[] args)
{
ConcreteSubject s = new ConcreteSubject();
s.Attach(new ConcreateObserver(s,"x"));
s.Attach(new ConcreateObserver(s, "y"));
s.State = "ABC";
s.Notify();
}
}
}
观察者模式的关键对象是主题Subject和观察者Observer,一个Subject可以有任意数目的Oberver,一旦Subject的状态发生变化,所有的
Oberver都可以得到通知。
相关文章推荐
- 我的Cocos2d-x学习笔记(九)游戏帧循环(游戏主循环)
- [LeetCode]Validate Binary Search Tree
- (1915)HDU
- 使用Spring JDBC框架连接并操作数据库
- 电脑使用
- ARP C代码实现
- (3351)HDU
- C++第四章实验3
- sgu238:Uncle Vasya and Bags for Potatoes(暴力)
- 前行,大牛博客资源
- Enum
- DIYkeepalive
- JavaScript中的apply()方法和call()方法使用介绍
- Redhat下安装配置R程序
- java.lang.NullPointerException pstmt = conn.prepareStatement(sql)报错
- OC视频笔记2.6(略)2.7-2.8-2.9(多态)2.10(权限修饰符的使用)2.11(@calss和import)
- ch6 抽象
- 玩转Light Blue之添加设备信息
- 由Java环境变量配置遇到的问题说开去
- JSTSC2015第三轮省队选拔赛 后记