java设计模式-----观察者

观察者模式,可以这样理解,有一个被观察的对象,观察者们根据被观察的对象做出的反应。

比如说,天下雨了,校长知道就就回家收衣服了,蚂蚁知道了就会搬家,小狗知道了就会乱叫。这个就符合一个观察者的模型,天气是被观察的对象,根据天气的变化,不同的东西做出不同的反应。

 

这时候我们可能按照以往的思维一下就想到了,可以这样做:

 

public class Ant
{
	public void doSth()
	{
		
	}
}


 

public class Dog
{
	public void doSth()
	{
		
	}
}


 

public class Teacher
{
	public void doSth()
	{
		
	}
}


 

public class Weather
{

	private static String rain;
	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		if("雨".equals(rain))
		{
			Teacher xiaozhang = new Teacher();
			xiaozhang.doSth();
			
			Dog dog = new Dog();
			dog.doSth();
			
			Ant ant = new Ant();
			ant.doSth();
		}

	}

}


你也许会认为其实这样也能很好的实现这样一个功能。

没错,这样是实现了功能,但是实际我们是将每个实物做的动作简化了,如果这时候我们的需求增加了点东西,校长下雨天不仅要回家收衣服,还要先送每个孩子回家,然后还要,然后还要。。。。狗下雨不仅要干啥,还要干啥,。。。。

 

你就会发现任何一个需求的变化,都会让你不得不去改动Weather类,即使蚂蚁在新增的需求中没有任何涉及到,但是你本身修改了weather类,导致蚂蚁也有可能被修改处问题,(谁知道你的修改会不会引起其他的问题,只有测试之后才知道),这时候你是不是很冤枉,我明明没有修改蚂蚁,为什么还要测一下他的功能?

 

没有错,如果你使用常规的写法,这些类紧紧的耦合在一起,每一次的修改就有可能引起问题,这也就是观察者的优势,他能够降低类的耦合度,让每个特性之间不再那么亲密。

 

下面我们看一下观察者怎么实现:

首先我们要确定天气就是这里的被观察对象。他应该有一些属性,比如一个能够存放观察他的对象的容器,能够增加一个观察者,能够去除一下观察者,并且应该有个方法能够通知观察者们。

 

 

public class Weather
{

	private List<Observer> observerList = new ArrayList<Observer>();
	
	
	public void addObserver(Observer o)
	{
		observerList.add(o);
	}
	
	public void removeOberver(Observer o)
	{
		observerList.remove(o);
	}
	
	public void notifyAllObserver()
	{
		for(Observer o : observerList)
		{
			o.update();
		}
	}

}

这里就是我们设计出来的被观察的对象,他有一个List来存放观察他的对象,同时提供了

	public void addObserver(Observer o)
	{
		observerList.add(o);
	}


能够添加一个观察者。

 

	public void removeOberver(Observer o)
	{
		observerList.remove(o);
	}

提供这个方法能够踢出一个观察者。

 

 

	public void notifyAllObserver()
	{
		for(Observer o : observerList)
		{
			o.update();
		}
	}

这个方法能够通知到每一个观察者。

 

这样我们只要将原来的设计的三个类,向下退一点,抽出一个公共的接口:

public interface Observer
{
	 void update();
}


 

每个类只要实现它就行了:

 

public class Ant implements Observer
{
	@Override
	public void update()
	{
		// TODO Auto-generated method stub
		
	}
}


 

 

public class Dog implements Observer
{

	@Override
	public void update()
	{
		// TODO Auto-generated method stub
		
	}
}


 

public class Teacher implements Observer
{

	@Override
	public void update()
	{
		// TODO Auto-generated method stub
		
	}
}

 

 

其实这就是最主要的观察者模式的思想了。

我们看一下jdk中的Observable和Observer两个类,其实他的主要思想和我们上面所讲的是一样的。。。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值