无废话C#设计模式之十九:Observer
2009-04-02 08:23:02 来源:WEB开发网l 一样的道理,ListPager也是一个观察者。它需要观察ButtonPager的变动。
l 注意到在ListPager和ButtonPager的ChangePage()方法中都更新了页面的索引值,你或许不理解为什么Label和GridView不更新呢?其实,这并没有什么奇怪,ButtonPager翻页后通知ListPager更新状态,最需要更新的状态就是页面索引值,用户不是直接点击ListPager翻页的,当然需要更新。Label和GridView中并没有实现是因为我们并没有实现具体的一些细节,在实际应用中这些控件保存一些状态也不奇怪。
l 最后来看一看怎么牵线搭桥。我们在ButtonPager的改变页面状态事件中注册了四个代理,也就是说它改变状态后需要通知四个观察者。怎么是四个呢?还包括它自己,从逻辑上可能难以理解,其实这是可行的重用代码的方案。对ButtonPager来说,是点击哪个控件翻页的并不重要,作为主体它的责任就是通知观察者,作为观察者它的责任就是更新状态或说对事件作出响应。
l 此例完整了一个四个观察者、两个主体的观察者模式。你可能角色一个类型既是观察者又是主体不可理解,其实这在现实生活中非常多的,生物链中的大部分生物既是观察者又是主体,“螳螂捕蝉,黄雀在后”中的螳螂就是。
l 再谈谈耦合和扩展。要再增加一个下拉框分页的分页控件怎么办?无须修改原来的代码,再写一个DropDownPager(继承Pager,实现Control),并且为它的修改分页事件和所有观察者挂钩就可以了。要再增加一个ListBox控件针对不同页数显示不同数据怎么办?也无须修改原来的代码,再写一个ListBox控件(实现Control),实现翻页响应的方法,并且订阅所有Pager的翻页事件即可。
更多精彩
赞助商链接