java设计形式之观察者模式(1)

java设计模式之观察者模式(1)

java设计模式之观察者模式

以前看到一本介绍设计模式的书,名字我忘记了java设计形式之观察者模式(1),要不就可以推荐给大家了。

下面的的讲解和示例,也是出自于那个书中的,凭记忆写给大家,如有不正确的,大家给我提意见我改正。

不说闲话了,进入正题。

 

引入一段孙子的话:知己知彼,百战不殆。

                              不知彼而知己,一胜一负。

                              不知必不知己,每战必殆。

 

了解自己很简单,因为是自己,那怎么了解他人每天行动呢,只能给他人身上安装监听器。

我们拿程序来说明孙子老爷爷的话。

首先定义一个他: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";
}

 这样我就能随时随地的监视他了,所以孙子老爷爷真有先见之明阿,这样你还能战败吗?