观察者模式定义(Observer Pattern)
观察者模式(Observer Pattern)也叫发布订阅模式(Publish/subscribe),它是一个在项目中经常使用的模式,其定义如下:
Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notofoed and updated automatically.(定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。)
美女效应
其实让我想起用一个例子来形容很恰当:当公司来了个美女,吸引了大堆单身男性的关注(当然也有某些已婚男士),当有一天有一个帅锅开着豪车抱着99朵玫瑰来接美女下班。那些关注她的男士会例行发了句牢骚:好白菜都让猪拱了!
- 美女就是被观察者
- 大堆的单身男士就是观察者
- 美女有了男朋友就是事件
- “好白菜都让猪拱了”就是得到通知后的状态更新
代码清单—被观察者
public abstract class AbsGirl {
private List<AbsBoy> boys = new ArrayList<AbsBoy>();
public void addBoy(AbsBoy boy){
boys.add(boy);
}
public void remove(AbsBoy boy){
boys.remove(boy);
}
/**
* 美女是否单身
*/
public void isSingle(Boolean isSingle){
for (AbsBoy boy : boys) {
boy.say(isSingle);
}
}
}
代码清单—具体被观察者
public class CharmingGirl extends AbsGirl{
public void notifyBoys(boolean b){
this.isSingle(b);//true 是单身 false 非单身
}
}
代码清单—观察者
public interface AbsBoy {
public void say(Boolean isSingle);
}
代码清单—具体观察者
public class SingleBoy implements AbsBoy {
@Override
public void say(Boolean isSingle) {
if(!isSingle){//美女是否有男朋友
System.out.println("好白菜都让猪拱了****");
}else{
System.out.println("我还有机会****");
}
}
}
代码清单—场景类
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
//公司来了一可爱的女孩
CharmingGirl girl = new CharmingGirl();
//单身狗们
AbsBoy boy1 = new SingleBoy();
AbsBoy boy2 = new SingleBoy();
AbsBoy boy3 = new SingleBoy();
AbsBoy boy4 = new SingleBoy();
//某些已婚男士 自由发挥吧 这里不写了
girl.addBoy(boy1);
girl.addBoy(boy2);
girl.addBoy(boy3);
girl.addBoy(boy4);
girl.notifyBoys(false);
}
}
好了,一个简单的观察者模式就这样完成了
升级版的观察者模式
还是按照上面的例子来说,这时候又一个男孩跟其他人一样也吐槽了句:好白菜都让猪拱了,之外。却不想放弃,就观察女孩啥时候跟男朋友吵架,伺机挖墙脚。好了 直接上代码
代码清单
//被观察者
public abstract class AbsGirl {
private List<AbsBoy> boys = new ArrayList<AbsBoy>();
public void addBoy(AbsBoy boy){
boys.add(boy);
}
public void remove(AbsBoy boy){
boys.remove(boy);
}
/**
* 美女是否单身 这里直接把女孩穿过去,好让男孩根据女孩获取女孩的状态
*/
public void isSingle(){
for (AbsBoy boy : boys) {
boy.say(this);
}
}
}
//具体被观察者
public class CharmingGirl extends AbsGirl{
Boolean isSingle;
public void notifyBoys(Boolean isSingle){
this.isSingle = isSingle;
this.isSingle();//true 是单身 false 非单身
}
/**
* @return 获取是否单身
*/
public Boolean getIsSingle(){
return this.isSingle;
}
/**
* @return 获取是否吵架了
*/
public State getState(){
return State.UNHAPPY;
}
}
//观察者
public interface AbsBoy {
public void say(AbsGirl absGirl);
}
//一般男孩
public class SingleBoy implements AbsBoy {
@Override
public void say(AbsGirl absGirl) {
Boolean isSingle = ((CharmingGirl)absGirl).getIsSingle();
if(!isSingle){//美女是否有男朋友
System.out.println("好白菜都让猪拱了****");
}else{
System.out.println("我还有机会****");
}
}
}
**
* 挖墙脚的男生
*
*/
public class InsistBoy implements AbsBoy{
@Override
public void say(AbsGirl absGirl) {
Boolean isSingle = ((CharmingGirl)absGirl).getIsSingle();
if(!isSingle){//美女是否有男朋友
System.out.println("好白菜都让猪拱了****");
//有男朋友有这样 选择合适的时机挖墙脚
State state = ((CharmingGirl)absGirl).getState();
switch (state) {
case UNHAPPY:
System.out.println("趁着她和男朋友吵架,开始挖墙脚");
break;
case HAPPY:
System.out.println("等待时机,伺机而动");
break;
default:
break;
}
}else{
System.out.println("我还有机会****");
}
}
}
//场景类
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
//公司来了一可爱的女孩
CharmingGirl girl = new CharmingGirl();
//单身狗们
AbsBoy boy1 = new SingleBoy();
AbsBoy boy2 = new SingleBoy();
AbsBoy boy3 = new SingleBoy();
AbsBoy boy4 = new SingleBoy();
AbsBoy insistBoy = new InsistBoy();
//某些已婚男士 自由发挥吧 这里不写了
girl.addBoy(boy1);
girl.addBoy(boy2);
girl.addBoy(boy3);
girl.addBoy(boy4);
girl.addBoy(insistBoy);
girl.notifyBoys(false);
}
}
//美女状态
public enum State {
HAPPY,UNHAPPY
}