java设计形式之观察者模式(1)
java设计模式之观察者模式(1)
java设计模式之观察者模式
以前看到一本介绍设计模式的书,名字我忘记了,要不就可以推荐给大家了。
下面的的讲解和示例,也是出自于那个书中的,凭记忆写给大家,如有不正确的,大家给我提意见我改正。
不说闲话了,进入正题。
引入一段孙子的话:知己知彼,百战不殆。
不知彼而知己,一胜一负。
不知必不知己,每战必殆。
了解自己很简单,因为是自己,那怎么了解他人每天行动呢,只能给他人身上安装监听器。
我们拿程序来说明孙子老爷爷的话。
首先定义一个他:Him,打仗嘛,无非就是武术和智商,除了天时地利以外。
package spring3.event; public class Him { private boolean isDoKungFu; private boolean isDoStudy; public void doKungFu() { System.out.println("他:开始练习武术了..."); this.isDoKungFu = true; } public void doStudy() { System.out.println("他:开始提高智商了..."); this.isDoStudy = true; } public boolean isDoKungFu() { return isDoKungFu; } public void setDoKungFu(boolean isDoKungFu) { this.isDoKungFu = isDoKungFu; } public boolean isDoStudy() { return isDoStudy; } public void setDoStudy(boolean isDoStudy) { this.isDoStudy = isDoStudy; } }
再来定义我, 我也要提高武术和智商,要比他高一点就行。
package spring3.event; public class Me { public void doKungFu() { System.out.println("我要练克制他的武术..."); } public void doStudy() { System.out.println("我要学习比他高的知识..."); } }
这样己和彼都建出来了,那怎样才能知彼呢?
我就需要一个监听器来监视他,哈哈,他还不知道
package spring3.event; public class Listener extends Thread { private Him him; private Me me; private String type; public Listener(Him him, Me me, String type) { this.him = him; this.me = me; this.type = type; } @Override public void run() { while (true) { // 监视他练武术 if (Const.KUNGFU.equals(this.type)) { // 发现他练武术,马上通知我了 if (this.him.isDoKungFu()) { this.me.doKungFu(); // 重新监视 this.him.setDoKungFu(false); } } // 监视他学习 if (Const.STUDY.equals(this.type)) { // 发现他学习,马上通知我了 if (this.him.isDoStudy()) { this.me.doStudy(); // 重新监视 this.him.setDoStudy(false); } } } } }
测试,看看效果
package spring3.event; public class Test { public static void main(String[] args) throws InterruptedException { Him him = new Him(); Me me = new Me(); Listener listener1 = new Listener(him, me, Const.KUNGFU); Listener listener2 = new Listener(him, me, Const.STUDY); // 开始监视 listener1.start(); listener2.start(); Thread.sleep(3000); him.doKungFu(); Thread.sleep(3000); him.doKungFu(); Thread.sleep(3000); him.doStudy(); Thread.sleep(3000); him.doStudy(); } }
结果:
他:开始练习武术了... 我要练克制他的武术... 他:开始练习武术了... 我要练克制他的武术... 他:开始提高智商了... 我要学习比他高的知识... 他:开始提高智商了... 我要学习比他高的知识...
常量文件
package spring3.event; public interface Const { String KUNGFU = "kungfu"; String STUDY = "study"; }
这样我就能随时随地的监视他了,所以孙子老爷爷真有先见之明阿,这样你还能战败吗?