首页 更多 正文
  • 本文约2395字,阅读需12分钟
  • 76
  • 0

优化代码结构-观察者模式

摘要

引言 在刚开始承接需求的时候,大多数的开发者都采用了一种平铺式的开发思路,从头到尾,一个方法就将需求实现啦,简单又快捷。殊不知后续的维护成为了头疼的事情,真是开发一时爽,后续维护火葬场。新增需求就成为打补丁的工作,慢慢的就成了人们常说的s山代码。 作为有点追求的开发者来说,提高自身面向对象编程的能力成为了补强的一个点。其中设计模式对于改造代码结构起着非常重要...

引言

在刚开始承接需求的时候,大多数的开发者都采用了一种平铺式的开发思路,从头到尾,一个方法就将需求实现啦,简单又快捷。殊不知后续的维护成为了头疼的事情,真是开发一时爽,后续维护火葬场。新增需求就成为打补丁的工作,慢慢的就成了人们常说的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都将收到通知,并更新自身状态。这正是观察者模式的核心思想。


扫描二维码,在手机上阅读
    评论