观察者模式(Observer)的直观实现(小明旅游的故事)

最近一直在IBM开发者上找点资料学西设计模式的资料,前段时间也看了些关于设计模式的视频,但总感觉云里雾里(只怪功力太浅),今天下午又重新看了下设计模式中的Observer模式,网上的和开发者上讲这个模式举的例子让我看的是似懂非懂...

于是自己想了一个通俗的例子,讲了一个故事。如下:

一天,小明突然想去杭州玩玩,因为年纪小,去之前必须先告诉爸爸妈妈,问问他们的意见。

于是,这个观察者模型就此构建起来了,小明爸妈是小明的监护人(哈哈,这样爸妈就是观察者,小明就是被观看者)。

首先 ,构建人物模型:

//为了节省版面,这里省去了get,set方法,读者可以自己加进去
public class Son extends Observable{

	private String destination;
	
	private String motherMessage;
	
	private String fatherMessage;
	
	protected void travel(){
		
		//5.他把他的想法告诉给他爸妈
		this.setChanged();
		this.notifyObservers(this);
		
	}
}



这是Son的对象


public class Father implements Observer{
	
	@Override
	public void update(Observable o, Object arg) {
		
		Son mySon = (Son)arg;
		
		//6.1 他的爸爸知道了后
		
		if("杭州".equals(mySon.getDestination())){
			
			System.out.println("去杭州干嘛啊?赶快回来");
			
			mySon.setFatherMessage("赶快回家");
		
		}
	
	}
	
}

这是Father对象


public class Mother implements Observer{
	
	@Override
	public void update(Observable o, Object arg) {
		//6.2他的老妈知道后
		
		Son mySon = (Son)arg;
		
		mySon.setMotherMessage("不管你去哪里,老妈都支持你 去吧,孩子");
		
		System.out.println("不管你去哪里,老妈都支持你 去吧,孩子");
		
	}
}

这是Mother对象


那么 现在来测试吧

public class Test1 {
	
	public static void main(String[] args) {
		
		//1.从前有个小孩
		Son son = new Son();
		
		
		//2.他的爸妈是他的监护人
		Father f = new Father();
		Mother m = new Mother();
		son.addObserver(m);
		son.addObserver(f);
		
		
		
		//3.有一天他想去杭州玩了
		son.setDestination("杭州");
		
		//4.所以他把准备travel的想法告诉了他的爸妈
		//其实你可以把这个travel()放到setDestination()中,
		//这样可以自动触发通知
		son.travel();

		//7.老爸老妈的答复
		//这个只是为了大家调试的,你可以取消注释
		//System.out.println(son.getFatherMessage());
		
 		//System.out.println(son.getMotherMessage());
	}
}


 

程序输出是:

去杭州干嘛啊?赶快回来
不管你去哪里,老妈都支持你 去吧,孩子


//有兴趣的同学可以去看看为什么先输出的是老爸的建议!明明是老妈先监听的啊,

//有同学可能会说,存储观察者用的是栈结构啊,哈哈,或许你看看Observable源码或许就知道了,这里就不赘述了


哈哈 就此一个观察者模式的完整流程出来了。。。其实你按照我标记的1,2,3,4,5,6,7一步步走下去就是整个流程了····

原来观察者模式也就这么点东西 其实也没那么玄乎,哎 主要是网上的例子太过生涩,这里就贴出我的例子和大家分享下,

希望对大家有用,我是小菜,写错的地方望谅解

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值