办公室的一天 - 观察者设计模式

 

公司项目进度紧,老板催着员工加班。

老班有时回来见客户,有时回来拿资料。

老板进办公室时,气氛很紧张,程序员都在埋头写代码。

老板离开办公室,气氛就轻松多了,程序员开始出去散步。

幸好,程序员跟前台妹妹关系不错。

老板进来时,前台妹妹会把消息群发给程序员。

请用Java程序实现办公室的一天。

 

考察的其实是观察者设计模式。

在JDK中,java.util.Observer代表了观察者,java.util.Observable 代表了被观察者。

本题中,老板是被观察者,前台妹妹既是观察者(观察老板),又是被观察者(要群发消息给程序员)。程序员是观察者。

示例代码如下:

 

package design_mode;

import java.util.Observable;

/**
 * Created by Andrew on 2016/10/31.
 */
public class Boss extends Observable {


    public void enterOffice(){
        setChanged();
        notifyObservers("1");
    }

    public void leaveOffice(){
        setChanged();
        notifyObservers("0");
    }


}

 

 

package design_mode;

import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

/**
 * Created by Andrew on 2016/10/31.
 */
public class StageGirl extends Observable implements Observer {

    private static final String WORK = "1";
    private static final String REST = "0";
    ArrayList<Programmer> programmers;


    @Override
    public void update(Observable o, Object arg) {
        if (arg instanceof String){
            setChanged();
            if (arg.equals(WORK)) {
                System.out.println("老板进来了");
                notifyObservers(WORK);
            }

            if (arg.equals(REST)) {
                System.out.println("老板离开了");
                notifyObservers(REST);
            }

        }

    }

}

  

package design_mode;

import java.util.Observable;
import java.util.Observer;

/**
 * Created by Andrew on 2016/10/28.
 */
public class Programmer implements Observer {

    private String name;
    public Programmer(String name){
        this.name = name;
    }

    void readyToWork(){
        System.out.println("程序员"+name+"正在埋头写代码");
    }

    void readyToRest(){
        System.out.println("程序员"+name+"走出去散散步");
    }


    @Override
    public void update(Observable o, Object arg) {
        if (arg instanceof String){
            if (arg.equals("1")){
                readyToWork();
            }
            if (arg.equals("0")){
                readyToRest();
            }
        }
    }
}

  

 

package design_mode;

/**
 * Created by Andrew on 2016/10/28.
 */
public class Office {
    Boss boss;
    StageGirl stageGirl;

    public Office(){
        boss = new Boss();
        stageGirl = new StageGirl();
        boss.addObserver(stageGirl);
        Programmer p1 = new Programmer("令狐冲");
        Programmer p2 = new Programmer("任我行");
        Programmer p3 = new Programmer("乔布斯");
        stageGirl.addObserver(p1);
        stageGirl.addObserver(p2);
        stageGirl.addObserver(p3);
        stageGirl.hasChanged();

    }

    public void bossEnter(){
        boss.enterOffice();
    }

    public void bossLeave(){
        boss.leaveOffice();
    }

    public static void main(String[] args) throws InterruptedException {

        Office office = new Office();
        office.bossEnter();
        office.bossLeave();
    }



}

  

 

运行结果:

老板进来了
程序员乔布斯正在埋头写代码
程序员任我行正在埋头写代码
程序员令狐冲正在埋头写代码
老板离开了
程序员乔布斯走出去散散步
程序员任我行走出去散散步
程序员令狐冲走出去散散步

  

 

posted @ 2016-10-31 15:49  andrew-chen  阅读(366)  评论(0编辑  收藏  举报