Java设计模式之观察者模式实践

       观察者模式定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。
       项目中一个对象状态发生变化,若需要通知到所有依赖其的对象,则我们可以使用观察者模式。

以下代码演示观察者模式简单的实际运用:

定义一个Subject(主题)接口:
package com.ldl.cn.ObserverModel;

public interface Subject {

    void addObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifySubject();
}

定义一个RealSubject类实现Subject接口:
package com.ldl.cn.ObserverModel;

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

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

    @Override
    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        if (observers.contains(observer)) {
            observers.remove(observer);
        }
    }

    @Override
    public void notifySubject() {
        for (Observer observer : observers) {
            observer.update(updateSubject);
        }
    }

    public void submitSubject(String updateSubject) {
        this.updateSubject = updateSubject;
        notifySubject();
    }
}

定义一个Observer (观察者)接口:
package com.ldl.cn.ObserverModel;

public interface Observer {
    public void update(String msg);
}

定义一个RealObserver类实现Observer接口:
package com.ldl.cn.ObserverModel;

public class RealObserver implements Observer{

    private String name;
    
    public RealObserver(String name) {
        super();
        this.name = name;
    }
    
    public String getName() {
        return name;
    }

    @Override
    public void update(String msg) {
        System.out.println(name+"收到subject:"+msg);
    }

}

编写测试类:
package com.ldl.cn.ObserverModel;

public class TestObserverPattern {

    public static void main(String[] args) {
        
        Subject subject = new RealSubject();
        
        RealObserver realObserver1 = new RealObserver("张三");
        RealObserver realObserver2 = new RealObserver("李四");
        RealObserver realObserver3 = new RealObserver("王五");

        subject.addObserver(realObserver1);
        subject.addObserver(realObserver2);
        subject.addObserver(realObserver3);

        ((RealSubject) subject).submitSubject("2019年五一劳动节放假4天!");
        System.out.println("--------------------");
        
        subject.removeObserver(realObserver1);
        ((RealSubject) subject).submitSubject("2019年十一国庆节放假7天!");
    }
}

运行结果:
张三收到subject:2019年五一劳动节放假4天!
李四收到subject:2019年五一劳动节放假4天!
王五收到subject:2019年五一劳动节放假4天!
--------------------
李四收到subject:2019年十一国庆节放假7天!
王五收到subject:2019年十一国庆节放假7天!

猜你喜欢

转载自blog.csdn.net/ldllovegyh/article/details/89410400