观察者模式

时间:2019-08-28
本文章向大家介绍观察者模式,主要包括观察者模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
/**
 * 抽象被观察者接口
 */
public interface Subject {
    //注册观察者
    public void registerObserver(Observer o);
    //移除观察者
    public void removeObserver(Observer o);
    //通知
    public void notifyObserver();
}

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

/**
 * 被观察者
 */
public class ConcreteSubject implements Subject{
    private List<Observer> list;
    private String message;
    public ConcreteSubject() {
        list = new ArrayList<>();
    }
    @Override
    public void registerObserver(Observer o) {
        list.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        if (!list.isEmpty()){
            list.remove(o);
        }
    }

    @Override
    public void notifyObserver() {
        for (Observer ob : list) {
            ob.update(message);
        }
    }
    //发送消息
    public void setInformation(String s){
        this.message = s;
        System.out.println("更新消息:"+s);
        notifyObserver();//通知观察者
    }
}
/**
 * 抽象观察者
 */
public interface Observer {
    public void update(String message);
}

/**
 * 观察者
 */
public class ConcreteObserver implements Observer {
    private String name;
    private String message;

    public ConcreteObserver(String name) {
        this.name = name;
    }
    @Override
    public void update(String message) {
        this.message = message;
        read();
    }

    private void read() {
        System.out.println(name+"收到推送消息:"+message);
    }
}
import com.mod.ConcreteObserver;
import com.mod.ConcreteSubject;

/**
 * 测试
 */
public class ObserverTest {
    public static void main(String[] args){
        ConcreteSubject subject = new ConcreteSubject();
        ConcreteObserver zs = new ConcreteObserver("zs");
        ConcreteObserver ls = new ConcreteObserver("ls");
        subject.registerObserver(zs);
        subject.registerObserver(ls);
        subject.setInformation("通知:中秋放假去月球");
        subject.removeObserver(zs);
        subject.setInformation("通知:中秋节活动取消");
        //更新消息:通知:中秋放假去月球
        //zs收到推送消息:通知:中秋放假去月球
        //ls收到推送消息:通知:中秋放假去月球
        //更新消息:通知:中秋节活动取消
        //ls收到推送消息:通知:中秋节活动取消
    }
}

原文地址:https://www.cnblogs.com/fly-book/p/11425105.html