设计模式——观察者模式
2015-12-15 20:03
232 查看
名字:
观察者模式属性:
行为型定义:
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己类图:
优点:
让耦合的双方都依赖于抽象,而不依赖于具体,使得各自的变化都不会影响另一边的变化缺点:
一、 没办法让每个控件都去实现观察者的接口,很多控件早就已经被他们的制造商给封装了二、 抽象通知者还是依赖抽象观察者,也就是说没有抽象观察者这样的接口,通知的功能就完不成
三、 每个具体的观察者调用的方法不一定相同,很多根本就不是同名的方法
何时用:
一、 一个对象的改变需要同事改变其他对象,并且不知道具体有多少对象有待改变时,应该考虑使用观察者模式。二、 一个抽象模型有两个方面,其中一方面依赖于另一方面,用观察者模式可以将两者封装在独立的对象中使他们各自独立的改变和复用
代码实现:
通知者接口:<span style="font-size:18px;">/通知者接口 interface Subject { //增加 void Attach(Observer observer); //减少 void Detach(Observer observer); //通知 void Notify(); //状态 string SubjectState { get; set; } } </span>
具体通知者:
<span style="font-size:18px;">//通知者 class Boss : Subject { //同事列表 //增加 //减少 //通知 public string Notify() { foreach (Observer o in observers) o.Update(); } //老板状态 } </span>
抽象观察者:
<span style="font-size:18px;">bstract class Observer { protected string name; protected Subject sub; public Observer(string name, Subject sub) { this.name = name; this.sub = sub; } public abstract void Update(); } </span>
具体观察者:
<span style="font-size:18px;">/看股票的同事 class StockObserver : Observer { public override void Update() { ...... } } </span>
客户端:
<span style="font-size:18px;"> static void Main(string[] args) { //省略实例化过程 huhansan.Attach(tongshi1); huhansan.SubjectState = "我回来了" //发出通知 huhansan.Notify(); } </span>
备注:
委托:是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。优点:
一、 一个委托可以搭载多个方法,所有方法被一次唤起。
二、 委托可以使得委托对象所搭载的方法并不属于同一个类
局限性:委托对象所搭载的所有方法必须具有相同的原型和形式,也就是拥有相同的参数列表和返回值类型。
使用:
声明委托:
Delegate void EventHandler();
声明委托事件Update:
Public event EventHandler Update;
使用委托:
Huhansan.Update+=new EventHandler(tongshi1.CloseStockMarket);
Huhansan.Update+=new EventHandler(tongshi2.CloseNBADirectSeeding);
相关文章推荐
- hdoj1234开门人和关门人
- java开发中文乱码总结
- Oracle 列转行函数 Listagg()
- 《JavaScript DOM编程艺术》学习整理
- MAC SVN 基本设置 终端命令
- [LeetCode]035-Search Insert Position
- cuda中矩阵相加编程
- CP学习笔记(8) - try: except 语句
- 图像和滚动 、 编程规范和Xcode(一)
- [test]图片
- poj 2565 Average is not Fast Enough! 水题
- hdoj1212Big Number
- 【leetcode题解】【回溯】【54】【M】Subsets II
- iOS 登录功能的实现
- 对象持久话与pickle模块
- 07 java main方法
- Spring学习笔记<一>
- python基础教程共60课-第43课查天气1
- ActivityUnitTestCase示例
- Linux内存寻址