设计模式之观察者模式

1.观察者模式

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

2.举个例子:小明快要高考了,小明的妈妈和爸爸监控着家里的电脑,一旦有人使用就会收到通知。这时小明的爸爸妈妈就为观察者(Observer),而电脑是否被使用就是一个主题(Subject)。小明的爸爸妈妈的信息需要注册到电脑中,当电脑被使用是他们才能收到通知。

(1).首先定义一个主题接口(定义了一些必要的方法)

//主题接口类
public interface Subject {
    void registerObserver(Observer observer); //将观察者注册到主题类中
    void removeObserver(Observer observer);   //移除观察者
    void notifyObservers();                   //通知所有的观察者
}

(2).定义一个电脑的状态的主题

public class ComputerState implements Subject {
    private ArrayList<Observer> observerArrayList = new ArrayList<>();   //保存了所有的观察者

    @Override
    public void registerObserver(Observer observer) {
        observerArrayList.add(observer);                  //将观察者注册到主题中
    }  

    @Override
    public void removeObserver(Observer observer) {            //移除观察者
        observerArrayList.remove(observer);
    }

    @Override
    public void notifyObservers() {                      //通知所有的观察者
        for (Observer o :
                observerArrayList) {
            o.update("有人在玩儿电脑了。。。");
        }
    }

    public void someOneUserComputer() {                  //电脑被人操作了
        notifyObservers();
    }
}

在此例中,注册方法表示这个观察者(小明的爸爸,妈妈,当然如果他的七大姑,八大姨如果想知道也可以进行注册。。。。)想要知道小明是否在玩电脑。

(3)定义观察者接口

//观察者接口类
public interface Observer {
    void update(String string); //用来通知观察者的方法,这里是发送一个信息(字符串)
}

(4)具体的观察者

public class XiaoMingFather implements Observer {   //小明的爸爸
    private Subject subject;

    public XiaoMingFather(Subject subject) {
        this.subject = subject;
        subject.registerObserver(this);      //将自己的信息注册到主题中
    }

    @Override
    public void update(String string) {
        System.out.println("小明爸爸知道" + string); 
    }
}
public class XiaoMingMother implements Observer {  //小明的妈妈
    private Subject subject;

    public XiaoMingMother(Subject subject) {
        this.subject = subject;
        subject.registerObserver(this);
    }

    @Override
    public void update(String string) {
        System.out.println("小明妈妈知道" + string);

    }
}

(5)这是小明。。。(作为测试)

public class XiaoMing {
    ComputerState computerState;

    public XiaoMing(ComputerState computerState) {
        this.computerState = computerState;
    }

    public void playGame(){
        computerState.someOneUserComputer();
    }
}

 

3.最后做个测试

public class Test {
    public static void main(String[] args) {
        ComputerState computerState = new ComputerState();        //这是一个电脑
        XiaoMingMother mother = new XiaoMingMother(computerState); //小明妈妈
        XiaoMingFather father = new XiaoMingFather(computerState); //小明爸爸
        XiaoMing xiaoMing = new XiaoMing(computerState);          //小明
        xiaoMing.playGame();                      //小明在作死。。。。。
    }
}

运行结果

最后。。。小明可能会比较惨

 

相关的代码放在 https://github.com/LiWangCai/blogRelated 上面,可自行获取

 

posted @ 2019-04-20 22:03  神奇海螺。  阅读(194)  评论(0编辑  收藏  举报