设计模式19Observer(观察者模式).docx
《设计模式19Observer(观察者模式).docx》由会员分享,可在线阅读,更多相关《设计模式19Observer(观察者模式).docx(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、无废话C#设计模式之十九:Observer意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。场景这次不说游戏了,假设我们需要在一个Web页面上分页显示数据。首先需要一个分页控制器和一个显示数据的表格。开始,客户的需求很简单,需要两个向前翻页向后翻页的按钮作为控制器,还需要一个GridView来显示数据。你可能会这么做:l 在页面上放两个按钮和一个GridView控件l 点击了下一页按钮判断是否超出了页面索引,如果没有的话更新GridView中的数据,然后更新控件的当前页,如果翻页后是最后一页的话把下一页按钮设置为不可用。l 点击了上一
2、页按钮判断是否超出了页面索引,如果没有的话更新GridView中的数据,然后更新控件的当前页,如果翻页后是第一页的话把上一页按钮设置为不可用。在这里,我们的翻页控件仅仅和GridView进行依赖,看似问题不大。没有想到,客户看了Demo后觉得这样的体验不好,希望在页面上呈现当前页和总共页。于是,我们又在页面上加了一个Label控件,在按钮的点击事件里面再去更新Label控件的值。客户挺满意的,随着软件中数据越来越多,总页数达到了几十页,客户觉得前后翻页太不合理的了,希望有一个显示页数列表的分页控制器,客户的这个请求彻底使我们晕了,代码被我们修改的非常混乱:l 点击了列表分页控件的页数后更新自身
3、状态、通知GridView加载数据、通知按钮分页控件更新自身状态、通知Label更新页数信息。l 点击了按钮分页控件后更新自身状态、通知GridView加载数据、通知列表分页控件更新自身状态、通知Label更新页数信息。如果今后页面上还需要针对分页功能有任何修改的话,真不知道怎么去改。由此引入观察者模式来解决这些问题。示例代码using System;using System.Collections.Generic;using System.Text;namespace ObserverExample class Program static void Main(string args) Bu
4、ttonPager buttonPager = new ButtonPager(); ListPager listPager = new ListPager(); Control gridview = new GridView(); Control label = new Label(); buttonPager.changePageHandler += new Pager.ChangePageHandler(buttonPager.ChangePage); buttonPager.changePageHandler += new Pager.ChangePageHandler(gridvie
5、w.ChangePage); buttonPager.changePageHandler += new Pager.ChangePageHandler(label.ChangePage); buttonPager.changePageHandler += new Pager.ChangePageHandler(listPager.ChangePage); listPager.changePageHandler += new Pager.ChangePageHandler(buttonPager.ChangePage); listPager.changePageHandler += new Pa
6、ger.ChangePageHandler(gridview.ChangePage); listPager.changePageHandler += new Pager.ChangePageHandler(label.ChangePage); listPager.changePageHandler += new Pager.ChangePageHandler(listPager.ChangePage); buttonPager.NextPage(); Console.WriteLine(); buttonPager.NextPage(); Console.WriteLine(); button
7、Pager.NextPage(); Console.WriteLine(); buttonPager.PreviousPage(); Console.WriteLine(); buttonPager.PreviousPage(); Console.WriteLine(); listPager.SelectPage(2); Console.WriteLine(); listPager.SelectPage(1); Console.WriteLine(); listPager.SelectPage(0); abstract class Pager protected int pageIndex =
8、 0; public int PageIndex get return pageIndex; set pageIndex = value; protected int pageCount = 3; public int PageCountget return pageCount; public event ChangePageHandler changePageHandler; public delegate void ChangePageHandler(Pager sender); protected void ChangePage() if (changePageHandler != nu
9、ll) changePageHandler(this); class ButtonPager : Pager, Control public void NextPage() if (pageIndex 0) Console.WriteLine(Click PreviousPage Button.); pageIndex-; ChangePage(); public void ChangePage(Pager sender) base.pageIndex = sender.PageIndex; if (pageIndex 0 & pageIndex pageCount - 1) Console.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 模式 19 Observer 观察者
限制150内