设计模式—观察者模式
来源:互联网 发布: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
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者
- 设计模式——观察者设计模式
- 模式设计:观察者模式
- 设计模式-----观察者模式
- 设计模式-观察者模式
- 设计模式--观察者模式
- 设计模式:观察者模式
- 设计模式-----观察者模式
- 设计模式:观察者模式
- 面包?爱情?
- mongodb.conf配置文件详解
- React Native官方入门教程
- zabbix+flume+hadoop安装及其监控
- 用两个栈实现队列
- 设计模式—观察者模式
- Python第三方库整理
- react三级选择联级响应
- 最简单也最复杂的设计模式 单例
- 终止继承:Final类和Final方法
- Maven 安装本地jar(备忘)
- 奋斗吧,程序员——第三十九章 人生不失意,焉能慕知己
- 在Linux终端中使用tree命令
- mac电脑使用