首页 > 技术文章 > 设计模式学习笔记之二:观察者模式

stonefeng 2016-07-14 23:26 原文

观察者模式定义了对象之间一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

Observer

package com.singland.dp.observer;

public interface Observer {
    public void update(Subject subject);
}

MyObserver1

package com.singland.dp.observer;

public class MyObserver1 implements Observer {

    @Override
    public void update(Subject subject) {
        System.out.println(String.format("MyObserver1: You are %s ?", subject.getMsg()));
    }
}

MyObserver2

package com.singland.dp.observer;

public class MyObserver2 implements Observer {

    @Override
    public void update(Subject subject) {
        System.out.println(String.format("MyObserver2: You are %s ?", subject.getMsg()));
    }
}

Subject

package com.singland.dp.observer;

import java.util.ArrayList;
import java.util.List;

public class Subject {
    
    private String msg;
    
    private List<Observer> observers = new ArrayList<Observer>();

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
    
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(this);
        }
    }

}

MyTest

package com.singland.dp.observer;

import org.junit.Test;

public class MyTest {
    
    @Test
    public void test() {
        Subject subject = new Subject();
        subject.registerObserver(new MyObserver1());
        subject.registerObserver(new MyObserver2());
        subject.setMsg("Linda");
        subject.notifyObservers();
    }

}

当项目中的业务逻辑有关于出版者跟订阅者的概念的时候,我们应该第一时间想到使用观察者设计模式来处理问题,观察者设计模式应该是最常见的设计模式了,java甚至提供了内置的观察者设计模式供开发人员使用,但是java内置的观察者设计模式还是有一些局限性的:

1. java.util.Observable是一个类而非接口,这违背了面向对象设计原则:面向接口编程而非针对实现编程。
2. setChanged方法是protected的,这意味着如果我们要使用这个方法就必须继承自Observable类,而java是只能单继承的,违背了组合优于继承原则
以上缺点限制了java内置观察者模式的可复用性。
当然,如果以上缺点并不会对项目中的业务逻辑造成什么问题的话,就大胆使用java内置观察者模式吧。

推荐阅读