设计模式—观察者模式

来源:互联网 发布:java获取sql执行成功 编辑:程序博客网 时间:2024/05/21 20:27

观察者模式定义(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}
0 0
原创粉丝点击