观察者模式完整版

253 阅读1分钟

什么是观察者模式?

我们常说的

  • callback
  • hook
  • listener
  • observer

都是观察者模式。。。

怎么用?

举个例子! 我们来模拟一个场景---孩子醒了,爸爸喂孩子 ,妈妈抱孩子,

分析:

这边观察者其实是爸爸和妈妈,被观察者是孩子。

enent事件是否是必须的呢?

这个还是看主观的,可以直接写在kid类里面,不过以后改的就太麻烦了,如果孩子类是整个孩子的抽象。 事件如果放在里面,就有歧义了,并不是所有孩子都会发生某个特殊事件,所有抽出去,解耦合,也符合语义。

package observe;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 吴洋
 */
public class Main {
	public static void main(String[] args) {
		Kids kids = new Kids();
		kids.add(new Mom()).add(new Dad());
		kids.wakeUp(-1);
	}
}


interface Event<T>{

}
class Kids{
	private int degree;
        //把孩子这个对象传进去,方便爸妈更据孩子情况做出判断
	KidsEvent kidsEvent = new KidsEvent(this);

	public int getDegree() {
		return degree;
	}

	public void setDegree(int degree) {
		this.degree = degree;
	}

	public boolean isCry() {
		return isCry;
	}

	public void setCry(boolean cry) {
		isCry = cry;
	}

	public List<KidsObserve> getList() {
		return list;
	}

	public void setList(List<KidsObserve> list) {
		this.list = list;
	}

	private boolean isCry;
        //拥有一个list然后遍历他
	private List<KidsObserve>list=new ArrayList<>();
	public Kids add(KidsObserve observe){
		list.add(observe);
		return this;
	}
	public void wakeUp(int nub){
		this.degree=nub;



		for (KidsObserve observe:list){
			observe.actionWakeUp(kidsEvent);
		}

	}
}
class KidsEvent implements Event<Kids>{
	public KidsEvent(Kids kids) {
		this.kids = kids;
	}

	private Kids kids;
	public Kids getSource(){
		return kids;
	}

}
interface KidsObserve{
	void actionWakeUp(KidsEvent event);

}

class Mom implements KidsObserve{

	public void hug(){
		System.out.println("mom");
	}
	@Override
	public void actionWakeUp(KidsEvent event) {
        //从这看出event有时是需要拥有kid对象的,
		Kids source = event.getSource();
		int degree = source.getDegree();
		if (degree>0){
		hug();}
		else {
			System.out.println("叫爸爸来揍你");
		}
	}
}
class Dad implements KidsObserve{

	public void feed(){
		System.out.println("dad");
	}
	@Override
	public void actionWakeUp(KidsEvent event) {
            //根据事件来做出选择
		Kids source = event.getSource();
		int degree = source.getDegree();
                //如果哭的程度很大就喂
		if (degree>0){
			feed();
		}else {
			System.out.println("gun");
		}

	}
}