办公室的一天 - 观察者设计模式
公司项目进度紧,老板催着员工加班。
老班有时回来见客户,有时回来拿资料。
老板进办公室时,气氛很紧张,程序员都在埋头写代码。
老板离开办公室,气氛就轻松多了,程序员开始出去散步。
幸好,程序员跟前台妹妹关系不错。
老板进来时,前台妹妹会把消息群发给程序员。
请用Java程序实现办公室的一天。
考察的其实是观察者设计模式。
在JDK中,java.util.Observer代表了观察者,java.util.Observable 代表了被观察者。
本题中,老板是被观察者,前台妹妹既是观察者(观察老板),又是被观察者(要群发消息给程序员)。程序员是观察者。
示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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" ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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); } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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(); } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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(); } } |
运行结果:
1 2 3 4 5 6 7 8 | 老板进来了 程序员乔布斯正在埋头写代码 程序员任我行正在埋头写代码 程序员令狐冲正在埋头写代码 老板离开了 程序员乔布斯走出去散散步 程序员任我行走出去散散步 程序员令狐冲走出去散散步 |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步