`
lovnet
  • 浏览: 6704606 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

(原创)无废话C#设计模式之十九:Observer

阅读更多

无废话C#设计模式之十九:Observer

意图

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

场景

这次不说游戏了,假设我们需要在一个Web页面上分页显示数据。首先需要一个分页控制器和一个显示数据的表格。开始,客户的需求很简单,需要两个向前翻页向后翻页的按钮作为控制器,还需要一个GridView来显示数据。你可能会这么做:

l 在页面上放两个按钮和一个GridView控件

l 点击了下一页按钮判断是否超出了页面索引,如果没有的话更新GridView中的数据,然后更新控件的当前页,如果翻页后是最后一页的话把下一页按钮设置为不可用。

l 点击了上一页按钮判断是否超出了页面索引,如果没有的话更新GridView中的数据,然后更新控件的当前页,如果翻页后是第一页的话把上一页按钮设置为不可用。

在这里,我们的翻页控件仅仅和GridView进行依赖,看似问题不大。没有想到,客户看了Demo后觉得这样的体验不好,希望在页面上呈现当前页和总共页。于是,我们又在页面上加了一个Label控件,在按钮的点击事件里面再去更新Label控件的值。客户挺满意的,随着软件中数据越来越多,总页数达到了几十页,客户觉得前后翻页太不合理的了,希望有一个显示页数列表的分页控制器,客户的这个请求彻底使我们晕了,代码被我们修改的非常混乱:

l 点击了列表分页控件的页数后更新自身状态、通知GridView加载数据、通知按钮分页控件更新自身状态、通知Label更新页数信息。

l 点击了按钮分页控件后更新自身状态、通知GridView加载数据、通知列表分页控件更新自身状态、通知Label更新页数信息。

如果今后页面上还需要针对分页功能有任何修改的话,真不知道怎么去改。由此引入观察者模式来解决这些问题。

示例代码

using System;

using System.Collections.Generic;

using System.Text;

namespace ObserverExample

{

class Program

{

static void Main(string[] args)

{

ButtonPager 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(gridview.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 Pager.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();

buttonPager.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 = 0;

public int PageIndex

{

get { return pageIndex; }

set { pageIndex = value; }

}

protected int pageCount = 3;

public int PageCount

{

get { return pageCount; }

}

public event ChangePageHandler changePageHandler;

public delegate void ChangePageHandler(Pager sender);

protected void ChangePage()

{

if (changePageHandler != null)

changePageHandler(this);

}

}

class ButtonPager : Pager, Control

{

public void NextPage()

{

if (pageIndex < pageCount - 1)

{

Console.WriteLine("Click NextPage Button...");

pageIndex++;

ChangePage();

}

}

public void PreviousPage()

{

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.WriteLine("<<Previous Next>>");

else if (pageIndex == 0)

Console.WriteLine("Next>>");

else

Console.WriteLine("<<Previous");

}

}

class ListPager : Pager, Control

{

public void SelectPage(int pageIndex)

{

if (pageIndex >= 0 && pageIndex < pageCount)

{

Console.WriteLine(string.Format("Click <{0}> Link...", pageIndex + 1));

base.pageIndex = pageIndex;

ChangePage();

}

}

public void ChangePage(Pager sender)

{

base.pageIndex = sender.PageIndex;

for (int i = 1; i <= pageCount; i++)

{

if (pageIndex + 1 == i)

Console.Write(string.Format(" <{0}> ", i));

else

Console.Write(string.Format(" {0} ", i));

}

Console.WriteLine();

}

}

interface Control

{

void ChangePage(Pager sender);

}

class GridView : Control

{

public void ChangePage(Pager sender)

{

Console.WriteLine(string.Format("GridView->Show data of page {0}", sender.PageIndex + 1));

}

}

classEN-

分享到:
评论

相关推荐

    C#设计模式.PDF

    完整的C#设计模式PDF版 C#设计模式(1) 4 一、 C# 面向对象程序设计复习 5 二、 设计模式举例 5 三、 先有鸡还是先有蛋? 7 四、 大瓶子套小瓶子还是小瓶子套大瓶子? 8 五、 .net本质 9 C#设计模式(2) 11 一、 ...

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)

    C#设计模式-吕震宇

    设计模式(19)-Observer Pattern 设计模式(18)-Command Pattern 设计模式(17)-Chain of Responsibility Pattern 设计模式(16)-Bridge Pattern 设计模式(15)-Facade Pattern 设计模式(14)-Flyweight...

    C#中的委托、事件和Observer设计模式使用方法示例

    此文档有助于学习C#委托、事件和Observer设计模式。

    C#设计模式大全

    C#设计模式(1) 一、 C# 面向对象程序设计复习 二、 设计模式举例 三、 先有鸡还是先有蛋? 四、 大瓶子套小瓶子还是小瓶子套大瓶子? 五、 .net本质 C#设计模式(2) 一、 "开放-封闭"原则(OCP) 二、 ...

    C#面向对象设计模式纵横谈(视频与源码)

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 C#面向对象设计模式纵横谈(20):(行为型模式) Chain Of Responsibility 职责链模式 C#面向对象设计模式纵横谈(21):(行为型模式) Memento 备忘...

    详解C#委托,事件,Observer设计模式

    详解C#委托,事件,Observer设计模式 1.将方法作为方法的参数 2.将方法绑定到委托 3.事件的由来 4.事件和委托的编译代码 5.委托、事件与Observer设计模式 6..Net Framework中的委托与事件

    C#设计模式_设计模式_C#_

    观察者模式(Observer Pattern) 17. 解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式...

    Observer设计模式实例

    Observer设计模式是一种经典的设计模式,在GOF 23种设计模式种 比较常用于实际。主要是有类指针传递并引用方法和消息传递响应的方法来实现。

    设计模式C++学习之观察者模式(Observer)

    设计模式C++学习之观察者模式(Observer)

    C#设计模式之Observer观察者模式解决牛顿童鞋成绩问题示例

    主要介绍了C#设计模式之Observer观察者模式解决牛顿童鞋成绩问题,简单讲述了观察者模式的原理并结合具体实例形式分析了使用观察者模式解决牛顿童鞋成绩问题的具体步骤相关操作技巧,并附带demo源码供读者下载参考,...

    C#23种设计模式_示例源代码及PDF

    解释器模式将描述怎样 在 有了一个简单的文法后, 使用模式设计解释这些语句。 在解释器模式里面提到的语言是指任 何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表 文法的命令类的等 级结构,也...

    36种最新设计模式整理

    36种最新设计模式整理 Design Pattern: Simple Factory 模式 Design Pattern: Abstract Factory 模式 Design Pattern: Builder 模式 Design Pattern: Factory Method 模式 Design Pattern: Prototype 模式 ...

    C#设计模式(23种设计模式)

    观察者模式(Observer Pattern) 17. 解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略...

    JAVA设计模式chm文档

    设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

    Observer设计模式

    观察者模式中推拉模式两种实现方式,主要是针对开发的一个项目的模型抽象出来的。有一个项目,有压力传感器、位移传感器、震动传感器等多种传感器每种类型有若干个传感器,对每个传感器做特定操作会引发历史曲线图、...

    C#版 24种设计模式

    工厂方法模式(Factory Method Pattern) 观察者模式(Observer Pattern) 建造者模式(Builder Pattern) 解释器模式(Interpreter Pattern) 命令模式(Command Pattern) 模板方法模式(Template Method Pattern) 桥接模式...

    Java设计模式 设计模式介绍

    1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、...

    设计模式之观察者模式(Observer)

    观察者模式(Observer) 用意:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。

    设计模式文档 chm

    设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

Global site tag (gtag.js) - Google Analytics