观察者模式

简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。

  观察者模式的结构

  观察者(Observer)模式是对象的行为型模式,又叫做发表-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-收听者(Source/Listener)模式或从属者(Dependents)模式。
  问答题

  第一题、我和妹妹跟妈妈说:“妈妈,我和妹妹在院子里玩;饭做好了叫我们一声。”请问这是什么模式?能否给出类图说明?

  问答题答案

  第一题答案、这是观察者模式。我和妹妹让妈妈告诉我们饭做好了,这样我们就可以来吃饭了。换用较为技术化的语言来说,当系统的主题(饭)发生变化时,就告诉系统的其它部份(观察者们,也就是妈妈、我和妹妹),使其可以调整内部状态(有开始吃饭的准备),并采取相应的行动(吃饭)。

  系统的类图说明如下。

 

 

 

 

 

 

第一个
public interface RandomNumberListener {//接口
	public void numberChanged(double d);
}

第二个
public class Consol implements RandomNumberListener{

	@Override
	public void numberChanged(double d) {
		System.out.println(d);
	}

}


第三个
public class SwingWindow 
		extends JFrame 
		implements RandomNumberListener{//观察者
	private JLabel label = new JLabel();
	public SwingWindow(){
		this.getContentPane().add( label);
		this.setSize(300,200);
		this.setVisible(true);
	}
	
	@Override
	public void numberChanged(double d) {
		label.setText(String.valueOf(d));
	}
	
}

第四个
public class RandomNumber {//业务
	private double r;
	private List<RandomNumberListener>  listeners = new ArrayList<RandomNumberListener>();
	
	
	//添加所有观察者
	public void addRandomNumberListener(RandomNumberListener lis){
		listeners.add(lis);
	}
	
	public void random(){
		r = Math.random();
		//数据发生改变,通知所有的观察者
		for (RandomNumberListener lis : listeners) {
			lis.numberChanged(r);
		}
	}
}

第五个
public class Test {
	public static void main(String[] args) throws InterruptedException{
		RandomNumber rn = new RandomNumber();
		
		SwingWindow sw = new SwingWindow();
		Consol c = new Consol();
		
		rn.addRandomNumberListener(sw);
		rn.addRandomNumberListener(c);
		
		while(true){
			rn.random();
			Thread.sleep(new Random().nextInt(3000)+1000L);
		}
	}

}
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值