2马马虎虎的放哨人BadNotifier
package lnurd.test; public class GoodNotifier extends Notifier { @Override public void addListener(Object object, String methodName, Object... args) { System.out.println("有新的同学委托尽职尽责的放哨人!"); this.getEventHandler().addEvent(object, methodName, args); } @Override public void notifyX() { System.out.println("尽职尽责的放哨人告诉所有需要帮忙的同学:老师来了"); try{ this.getEventHandler().notifyX(); }catch(Exception e){ e.printStackTrace(); } } } //对于BadNotifier代码类似,不再复述.接下来是玩游戏的学生:PlayingGameListener
package lnurd.test; import java.util.Date; public class PlayingGameListener { public PlayingGameListener(){ System.out.println("我正在玩游戏 开始时间"+new Date()); } public void stopPlayingGame(Date date){ System.out.println("老师来了,快回到座位上,结束时间"+date); } }在接下来是看电视的学生WatchingTVListener
package lnurd.test; import java.util.Date; public class WatchingTVListener { public WatchingTVListener(){ System.out.println("我正在看电视 "+new Date()); } public void stopWatchingTV(Date date){ System.out.println("老师来了,快关闭电视 。 结束时间"+date); } }测试代码:
//创建一个尽职尽责的放哨者 Notifier goodNotifier=new GoodNotifier(); //创建一个玩游戏的同学,开始玩游戏 PlayingGameListener playingGameListener=new PlayingGameListener(); //创建一个看电视的同学,开始看电视 WatchingTVListener watchingTVListener=new WatchingTVListener(); //玩游戏的同学告诉放哨的同学,老师来了告诉一下 goodNotifier.addListener(playingGameListener, "stopPlayingGame",new Date()); //看电视的同学告诉放哨的同学,老师来了告诉一下 goodNotifier.addListener(watchingTVListener, "stopWatchingTV",new Date()); try{ //一点时间后 Thread.sleep(1000); }catch(Exception e){ e.printStackTrace(); } //老师出现,放哨的人通知所有要帮忙的同学:老师来了 goodNotifier.notifyX();点评:
1。放哨者完全不知道做游戏者的存在,完全解耦。(当然,功劳归功于Event和EventHandler,且这两个类具有通用性)
2。老师来了后游戏者停止游戏回到座位,看电视着关闭电视。(一次通知,执行了不同类的不同方法)
3。扩展性很高,再来一个打篮球的学生就先写个打篮球学生类,并在测试代码中告诉放哨者一下就好,放哨者完全没有变。重用性好