观察者模式介绍:
首先观察者模式分为两个对象,1观察者,2被观察对象。
然后被观察对象维护一个观察者的列表,当被观察者对象的状态改变的时候,通知所有观察者做出相应的响应。此种方式避免了观察者一直轮询被观察对象的状态,而是被观察对象主动通知。
举个栗子。一个漂亮的女孩子是被观察者,一群男孩子是观察者,所有男孩子都在观察女孩子的状态,但是每个男孩子不可能都定时去问候女孩子,什么粥可温,衣可暖,喝热水等等。而是观察女孩子的动态,比如朋友圈。一旦女孩子有什么动态,发个朋友圈,所有男孩子都看的到,然后就做出不同的反应,比如女孩子感冒了,不开心了等等。有的男孩子就嘘寒问暖,有的则不为所动。但是女孩子的朋友圈也不是对所有人可见,只有那些预选人员才可见也就相当于我们说的被观察者的观者者列表 。
那么我们可以用代码试着实现了:
package monitor;
import java.util.ArrayList;
import java.util.List;
/**
* 漂亮女孩被观察者
* */
public class BeautifulGirl {
private List<Boy> boyList = new ArrayList<Boy>();
@SuppressWarnings("unused")
private String msg = null;
//添加一个观察者
public void addBoy(Boy boy){
boyList.add(boy);
};
//移除一个观察者
public void removeBoy(Boy boy){
boyList.remove(boy);
};
public void setMsg(String msg){
this.msg = msg;
for(Boy boy:boyList){
boy.behavior(msg);
}
}
}
package monitor;
/**
* 观察者接口
* */
public interface Boy {
public void behavior(String msg);
}
package monitor;
/**
* 观察者1
* */
public class RichBoy implements Boy{
@Override
public void behavior(String msg) {
// TODO Auto-generated method stub
System.out.println("RichBoy has received the girl's msg :"+ msg);
}
}
package monitor;
/**
* 观察者2
* */
public class GoodBoy implements Boy{
@Override
public void behavior(String msg) {
// TODO Auto-generated method stub
System.out.println("GodBoy has received the girl's msg:" +msg);
}
}
package monitor;
public class GirlTest {
public static void main(String[] args) {
// 被观察者
BeautifulGirl beautifulGirl = new BeautifulGirl();
//观察者1
Boy goodBoy = new GoodBoy();
//观察者2
Boy richBoy = new RichBoy();
//添加观察者1
beautifulGirl.addBoy(richBoy);
//添加观察者2
beautifulGirl.addBoy(goodBoy);
//被观察者更新状态
beautifulGirl.setMsg("I'm sad");
}
}
运行结果