优化代码结构-观察者模式
引言
在刚开始承接需求的时候,大多数的开发者都采用了一种平铺式的开发思路,从头到尾,一个方法就将需求实现啦,简单又快捷。殊不知后续的维护成为了头疼的事情,真是开发一时爽,后续维护火葬场。新增需求就成为打补丁的工作,慢慢的就成了人们常说的s山代码。
作为有点追求的开发者来说,提高自身面向对象编程的能力成为了补强的一个点。其中设计模式对于改造代码结构起着非常重要的作用,并且主流框架里面也很多地方采用了设计模式的地方,因此熟悉设计模式,对于自己的需求实现还是理解其他项目也起着非常重要的作用。
今天来记录一下一个最简单的设计模式-观察者模式
观察者模式(Observer Pattern)
意图:是一种行为设计模式,用于定义对象之间的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
其UML类图如下所示
观察者模式UML图
观察者模式包含以下角色:
• Subject(主题):也称为被观察者,它是状态持有者,负责维护观察者列表,并在自身状态发生变化时通知所有观察者。包含注册、移除、通知方法。
• Observer(观察者):它是具体观察者对象,实现了一个更新方法,当Subject的状态变化时,由Subject调用此方法来通知观察者更新自身。Observer通常包含以下方法:update(): 接收Subject的通知,更新自身的状态。
根据类图实现的简单代码,要用于模拟一个新闻站点发布新闻后,不同的新闻订阅者能够接收到这些新闻更新的情况。
public class Main {
public static void main(String[] args) {
NewsSite newsSite = new NewsSite();
Observer observer1 = new NewsSubscriber("中心报刊");
Observer observer2 = new NewsSubscriber("地方报刊");
Observer observer3 = new NewsSubscriber("基层报刊");
newsSite.registerObserver(observer1);
newsSite.registerObserver(observer2);
newsSite.registerObserver(observer3);
newsSite.postNews("今天发生了很大的事情,油价低到6元每升!!!");
}
}
// 观察者接口
interface Observer{
void update(String message);
}
class NewsSubscriber implements Observer {
private String name;
public NewsSubscriber(String name){
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " received: " + message);
}
}
// 主题接口,被观察者,可以实现观察者的组成、剔除和通知
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(String message);
}
// 具体主题:新闻站点,具体被观察者
class NewsSite implements Subject {
private List observers = new ArrayList();
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
public void postNews(String news) {
System.out.println("News Site: New news posted - " + news);
notifyObservers(news);
}
}
代码解析如下:
• Observer: 包含一个方法 update(String message)。
• Subject: 包含三个方法 registerObserver(Observer observer), removeObserver(Observer observer), 和 notifyObservers(String message)。
• NewsSite: 实现了Subject接口,并且添加了一个自己的方法 postNews(String news)。
• NewsSubscriber: 实现了Observer接口。
• NewsSubscriber与Observer之间是实现(Implementation)关系。
• NewsSite与Subject之间同样是实现(Implementation)关系。
• NewsSite与Observer之间存在关联(Association)关系,因为NewsSite需要维护一个Observer的列表,并且能够向这些Observer发送消息。
总结
综上所述,NewsSite作为Subject,NewsSubscriber作为Observer。当NewsSite发布新闻时,所有注册的NewsSubscriber都将收到通知,并更新自身状态。这正是观察者模式的核心思想。