当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

    普通数据类

    1. /**
    2. * @author meikb
    3. * @desc 存储数据类 一个数据改变 通知其他数据
    4. * @date 2020-05-26 10:48
    5. */
    6. public class DataObj implements Observer{
    7. public int getNum() {
    8. return num;
    9. }
    10. public void setNum(int num) {
    11. this.num = num;
    12. }
    13. private int num;
    14. public DataObj(int num){
    15. this.num = num;
    16. }
    17. @Override
    18. public void change(DataCenter dataCenter) {
    19. System.out.println("我想要减1,大家都一起减1");
    20. dataCenter.notifyObserver();
    21. }
    22. @Override
    23. public void updateSelf() {
    24. num = this.num - 1;
    25. }
    26. }

    观察者类

    1. /**
    2. * @author meikb
    3. * @desc
    4. * @date 2020-05-26 10:45
    5. */
    6. public interface Observer {
    7. public abstract void change(DataCenter dataCenter); //负责发现数据变化
    8. public abstract void updateSelf(); //更新数据
    9. }

    数据服务中心

    1. /**
    2. * @author meikb
    3. * @desc
    4. * @date 2020-05-26 10:48
    5. */
    6. public class DataCenter {
    7. private List<Observer> observers = new ArrayList<>();
    8. public void notifyObserver(){
    9. observers.forEach(observer -> {
    10. observer.updateSelf();
    11. });
    12. }
    13. public void addData(Observer observer){
    14. observers.add(observer);
    15. }
    16. @Override
    17. public String toString() {
    18. StringBuilder sb = new StringBuilder();
    19. observers.forEach(observer -> {
    20. DataObj dataObj = (DataObj)observer;
    21. sb.append(dataObj.getNum());
    22. });
    23. return sb.toString();
    24. }
    25. }

    测试主函数

    1. /**
    2. * @author meikb
    3. * @desc
    4. * @date 2020-05-26 11:02
    5. */
    6. public class ObserverMain {
    7. public static void main(String[] args) {
    8. DataCenter center = new DataCenter();
    9. DataObj dataObj1 = new DataObj(1);
    10. center.addData(dataObj1);
    11. DataObj dataObj2 = new DataObj(2);
    12. center.addData(dataObj2);
    13. DataObj dataObj3 = new DataObj(3);
    14. center.addData(dataObj3);
    15. dataObj1.change(center);
    16. System.out.println(center);
    17. }
    18. }