什么是观察者模式?
我们常说的
- 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");
}
}
}