《设计模式(二)之——观察者模式》

一、情景:

老王、老李、老张都让媒婆帮他们找对象。

在这里插入图片描述

二、 情景后续:

媒婆得到消息后、居然懒得一个一个通知

在这里插入图片描述

三、观察者模式(Observer)

针对上面媒婆的处境我们可以使用观察者模式来解决。观察者模式是一种行为设计模式。观察者模式的用途是,当你对一个对象的状态感兴趣,希望在它每次发生变化时获得通知。在观察者模式中,观察另外一个对象状态的对象叫做Observer观察者,被观察的对象叫着Subject被观察者。

  • 定义了定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他所有的依赖者都会收到通知并自动更新
  • 重要组件
  • Subject(被观察者)包含了一些需要在其状态改变时通知的观察者
  • Observer(观察者),当被观察者发生改变时会通知观察者。

四、代码演示

4.1类图

在这里插入图片描述

  • 观察者中其实还维护者被观察者,因为观察者需要把自己注册进去,在下面的代码中有体现
4.2观察者接口
/**
 * @author liuzihao
 * @create 2020-09-20-18:56
 */
public interface ObserverI {
    
    
    public void update();
}
4.3不同的观察者
  • 观察者老王
public class ObserverW implements ObserverI{
    
    
    private SubjectI subjectI;

    public ObserverW(SubjectI subjectI) {
    
    
        this.subjectI = subjectI;
        subjectI.add(this);
    }
    @Override
    public void update() {
    
    
        System.out.println("老王:快来看老婆啦");

    }
}
  • 观察者老李
public class ObserverL implements ObserverI {
    
    
    private SubjectI subjectI;

    public ObserverL(SubjectI subjectI) {
    
    
        this.subjectI = subjectI;
        subjectI.add(this);
    }
    @Override
    public void update() {
    
    
        System.out.println("老李:快来看老婆啦");
    }
}
  • 观察者老张
public class ObserverZ implements ObserverI {
    
    
    private SubjectI subjectI;

    public ObserverZ(SubjectI subjectI) {
    
    
        this.subjectI = subjectI;
        subjectI.add(this);
    }
    @Override
    public void update() {
    
    
        System.out.println("老张:快来看老婆啦");
    }
}

4.4消息的发布者(被观察者)
  • 被观察的媒婆
    在媒婆这里拿有每个观察者的信息,当他收到小姐姐的信息,媒婆只需要调用notifyAll方法即可

public interface SubjectI {
    
    
    public void add(ObserverI observerI);
    public void remove(ObserverI observerI);
    public void notifyObserver();
}


public class SubjectMeiPo implements SubjectI {
    
    

    private List<ObserverI> obervers = new ArrayList<>();

    @Override
    public void add(ObserverI observerI) {
    
    
        obervers.add(observerI);
    }

    @Override
    public void remove(ObserverI observerI) {
    
    
        for (ObserverI oberver : obervers) {
    
    
            if (oberver.equals(observerI)){
    
    
                obervers.remove(oberver);
                break;
            }
        }
    }

    @Override
    public void notifyObserver() {
    
    
        obervers.stream().forEach(ObserverI::update);
    }
}
5、代码测试
/**
 * @author liuzihao
 * @create 2020-09-20-19:18
 */
public class MainDemo {
    
    
    public static void main(String[] args) {
    
    
        //1、初始化被观察者(媒婆)
        SubjectI subjectI = new SubjectMeiPo();
        // 2、初始化观察者
        ObserverI lw = new ObserverW(subjectI);
        ObserverI lz = new ObserverZ(subjectI);
        ObserverI ll = new ObserverL(subjectI);
        System.out.println("准备工作完毕");

        System.out.println("哇!- 我收到了一个小姐姐的消息赶紧通知他们 ");
        subjectI.notifyObserver();
        System.out.println("全部通知完咯,那就看他们谁先抢到吧");

    }
}

在这里插入图片描述

五、小结

观察者模式的一大特点其实就是松耦合、被观察的对象只知道观察者,实现了同一个接口如:update,而不需要知道具体的实现,所以当当又来了单身老吴,他想托媒婆帮他找老婆的话,那么他只需要,实现改接口,即可,当媒婆有小姐姐的资料时也会通知到,单身老吴.

猜你喜欢

转载自blog.csdn.net/weixin_43732955/article/details/108696260
今日推荐