设计模式【观察者模式Observer Pattern】
来源:互联网 发布:淘宝网装修图片 编辑:程序博客网 时间:2024/06/06 22:45
观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
介绍
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
如何解决:使用面向对象技术,可以将这种依赖关系弱化。
关键代码:在抽象类里有一个 ArrayList 存放观察者们。
应用实例: 1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。 2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作。
优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。
实现
观察者模式使用三个类 Subject、Observer 和 Client。Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。我们创建 Subject 类、Observer 抽象类和扩展了抽象类 Observer 的实体类。
ObserverPatternDemo,我们的演示类使用 Subject 和实体类对象来演示观察者模式。
步骤 1
创建 Subject 类。
Subject.cs
using System.Collections.Generic;namespace Observer_Pattern{ class Subject { List<Observer> observers = new List<Observer>(); int state; public int getState() { return state; } public void setState(int state) { this.state = state; notifyAllObservers(); } public void attach(Observer observer) { observers.Add(observer); } public void notifyAllObservers() { foreach (var observer in observers) { observer.update(); } } }}
步骤 2
创建 Observer 类。
Observer.cs
namespace Observer_Pattern{ abstract class Observer { protected Subject subject; public abstract void update(); }}
步骤 3
创建实体观察者类。
BinaryObserver.cs
using System;namespace Observer_Pattern{ class BinaryObserver : Observer { public BinaryObserver(Subject subject) { this.subject = subject; this.subject.attach(this); } public override void update() { Console.WriteLine("Binary String: " + Convert.ToString(subject.getState(), 2)); } }}
OctalObserver.cs
using System;namespace Observer_Pattern{ class OctalObserver : Observer { public OctalObserver(Subject subject) { this.subject = subject; this.subject.attach(this); } public override void update() { Console.WriteLine("Octal String: " + Convert.ToString(subject.getState(), 8)); } }}
HexaObserver.cs
using System;namespace Observer_Pattern{ class HexaObserver : Observer { public HexaObserver(Subject subject) { this.subject = subject; this.subject.attach(this); } public override void update() { Console.WriteLine("Hex String: " + Convert.ToString(subject.getState(), 16).ToUpper()); } }}
步骤 4
使用 Subject 和实体观察者对象。
ObserverPatternDemo.cs
using System;namespace Observer_Pattern{ class ObserverPatternDemo { 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.Read(); } }}
步骤 5
验证输出。
First state change: 15Hex String: FOctal String: 17Binary String: 1111Second state change: 10Hex String: AOctal String: 12Binary String: 1010
- 观察者设计模式(Observer Pattern)
- 设计模式17:Observer Pattern (观察者模式)
- 设计模式-观察者模式(Observer Pattern)
- 设计模式之观察者模式(Observer Pattern)
- c++设计模式:观察者模式(Observer Pattern)
- 设计模式学习--观察者模式(Observer Pattern)
- 设计模式 - 观察者模式(Observer Pattern) 详解
- 设计模式 - 观察者模式(Observer Pattern) 详解
- 设计模式 - 观察者模式(Observer Pattern) 详解
- 设计模式心得:观察者模式 (observer pattern)
- 设计模式-观察者模式(observer pattern)
- 设计模式之观察者模式---Observer Pattern
- 设计模式--观察者模式【Observer Pattern】
- Java设计模式--观察者模式【Observer Pattern】
- 设计模式【观察者模式Observer Pattern】
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- json对象简介
- 数据存储引擎比较
- Java面试的总结
- 阿里巴巴Java开发手册Eclipse插件使用指南
- tensorflow 实现AlexNet(附lrn API介绍)
- 设计模式【观察者模式Observer Pattern】
- svn安装的几种方法
- 关于sizeof一个类对象
- 给定一个链表和一个值x,对它进行分区,使得小于x的所有节点都在大于或等于x的节点之前.保留两个分区中的每一个节点的原始相对顺序。
- 远程工具之一---rsync用法介绍
- AndroidStudio快捷键大全
- 从经济学博士到爬坑机器学习十年,微软首席数据科学家谢梁的AI故事
- error LNK2019: unresolved external symbol main referenced in function __tmainCRTStartup
- 并发与并行的区别