设计模式—观察者模式

观察者模式定义(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
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值