设计模式系列 - 观察者模式
程序员文章站
2022-05-02 11:57:43
当对象之间存在一对多的关系时,若需要进行对象之间的通知,则可使用观察者模式 介绍 观察者模式属于行为型模式,当一个对象的状态发生改变时,若我们想通知其他对象,此时可通过观察者模式来进行解决。 类图描述 代码实现 1、定义抽象观察者 2、定义观察者管理类 3、定义具体观察者 4、上层调用 总结 观察者 ......
当对象之间存在一对多的关系时,若需要进行对象之间的通知,则可使用观察者模式
介绍
观察者模式属于行为型模式,当一个对象的状态发生改变时,若我们想通知其他对象,此时可通过观察者模式来进行解决。
类图描述
代码实现
1、定义抽象观察者
public abstract class observer { protected subject subject; public abstract void update(); }
2、定义观察者管理类
public class subject { private list<observer> observers = new list<observer>(); private int state; public int getstate() => this.state; public void setstate(int state) { this.state = state; nitifyallobservers(); } public void attach(observer observer) { observers.add(observer); } private void nitifyallobservers() { foreach (var observer in observers) { observer.update(); } } }
3、定义具体观察者
public class binaryobserver : observer { public binaryobserver(subject subject) { this.subject = subject; this.subject.attach(this); } public override void update() { console.writeline($"binary string:{subject.getstate()}"); } } public class hexaobserver:observer { public hexaobserver(subject subject) { this.subject = subject; this.subject.attach(this); } public override void update() { console.writeline($"hex string:{subject.getstate()}"); } } public class octalobserver:observer { public octalobserver(subject subject) { this.subject = subject; this.subject.attach(this); } public override void update() { console.writeline($"octal string:{subject.getstate()}"); } }
4、上层调用
class program { static void main(string[] args) { subject subject = new subject(); new hexaobserver(subject); new octalobserver(subject); new binaryobserver(subject); console.writeline("first state change:15"); subject.setstate(15); console.writeline("second state change:10"); subject.setstate(10); console.readkey(); } }
总结
观察者模式通过一种集合方式将所有观察者管理起来,并最终循环遍历通知所有对象。