理解软件设计模式( 三 )


观察者模式:如果有更新,那么订阅了该话题/主题的客户端将被通知 。
理解观察者模式的最简单方法是想象一个邮件列表,你可以在其中订阅任何主题,无论是开源、技术、名人、烹饪还是您感兴趣的任何其他内容 。每个主题维护者一个它的订阅者列表,在观察者模式中它们相当于观察者 。当某一个主题更新时,它所有的订阅者(观察者)都将被通知这次改变 。并且订阅者总是能取消某一个主题的订阅 。
如下图所示,客户端可以订阅不同的主题并添加观察者以获得最新信息的通知 。因为观察者不断的监听着这个主题,这个观察者会通知客户端任何发生的改变 。
 
理解软件设计模式

文章插图
Observer pattern
 
让我们来看看观察者模式的代码示例,从主题/话题类开始:
package org.opensource.demo.observer;public interface Topic { public void addObserver([Observer][22] observer); public void deleteObserver([Observer][22] observer); public void notifyObservers();}这段代码描述了一个为不同的主题去实现已定义方法的接口 。注意一个观察者如何被添加、移除和通知的 。
这是一个主题的实现示例:
package org.opensource.demo.observer;import java.util.List;import java.util.ArrayList;public class Conference implements Topic { private List<Observer> listObservers; private int totalAttendees; private int totalSpeakers; private [String][18] nameEvent; public Conference() { listObservers = new ArrayList<Observer>(); } public void addObserver([Observer][22] observer) { listObservers.add(observer); } public void deleteObserver([Observer][22] observer) { int i = listObservers.indexOf(observer); if (i >= 0) { listObservers.remove(i); } } public void notifyObservers() { for (int i=0, nObservers = listObservers.size(); i < nObservers; ++ i) { [Observer][22] observer = listObservers.get(i); observer.update(totalAttendees,totalSpeakers,nameEvent); } } public void setConferenceDetails(int totalAttendees, int totalSpeakers, [String][18] nameEvent) { this.totalAttendees = totalAttendees; this.totalSpeakers = totalSpeakers; this.nameEvent = nameEvent; notifyObservers(); }}这段代码定义了一个特定主题的实现 。当发生改变时,这个实现调用它自己的方法 。注意这将获取观察者的数量,它以列表方式存储,并且可以通知和维护观察者 。
这是一个观察者类:
package org.opensource.demo.observer;public interface [Observer][22] { public void update(int totalAttendees, int totalSpeakers, [String][18] nameEvent);}这个类定义了一个接口,不同的观察者可以实现该接口以执行特定的操作 。
例如,实现了该接口的观察者可以在会议上打印出与会者和发言人的数量:
package org.opensource.demo.observer;public class MonitorConferenceAttendees implements [Observer][22] { private int totalAttendees; private int totalSpeakers; private [String][18] nameEvent; private Topic topic; public MonitorConferenceAttendees(Topic topic) { this.topic = topic; topic.addObserver(this); } public void update(int totalAttendees, int totalSpeakers, [String][18] nameEvent) { this.totalAttendees = totalAttendees; this.totalSpeakers = totalSpeakers; this.nameEvent = nameEvent; printConferenceInfo(); } public void printConferenceInfo() { [System][19].out.println(this.nameEvent + " has " + totalSpeakers + " speakers and " + totalAttendees + " attendees"); }}接下来现在你已经阅读了这篇对于设计模式的介绍引导,你还可以去寻求了解其他设计模式,例如外观模式,模版模式和装饰器模式 。也有一些并发和分布式系统的设计模式如断路器模式和锚定模式 。
可是,我相信最好的磨砺你的技能的方式首先是通过在你的业余项目或者练习中实现这些设计模式 。你甚至可以开始考虑如何在实际项目中应用这些设计模式 。接下来,我强烈建议你查看 OOP 的 SOLID 原则。之后,你就准备好了解其他设计模式 。


推荐阅读