`

设计模式------观察者模式

阅读更多
大量参考设计模式之禅

观察者---就是间谍哈,或者叫偷窥狂也可以
秦国的李斯要监视韩非子的一举一动,怎么办?

方法1:派间谍呗,但是间谍得时时刻刻工作才能观察到韩非子的一举一动哈
public class HanFeiZi{
   //作为监视的判断标准
   private boolean isHaveBreakfast = false; //别人要在外面能监视到他,那么他必须提供一个漏洞来让别人监视,这个漏洞是在getter中啦
   private boolean isHaveFun = false;
   public void haveBreakfast(){
      System.out.println("韩非子:开始吃饭了...");
      this.isHaveBreakfast = true;
   }
   public void haveFun(){
       System.out.println("韩非子:开始娱乐了");
       this.isHaveFun = true;
   }
   //.....setter/getter
}

public class LiSi {
   public void update(String str){ //李斯做在家里听探子的报告就可以了,所以给探子一个接口
         System.out.println("收到探子来信");
        this.reportToQiShiHuang(str);
        System.out.println("报告完毕,回家打酱油");
   }
   .....
}

class Spy extends Thread{
    private HanFeiZi hanFeiZi;
    private LiSi lisi; 
    private String type; //说明他是那种类型的间谍,是偷窥韩非子吃饭呢,还是偷窥韩非子洗澡呢
  
    public Spy(HanFeiZi hanFeiZi,LiSi lisi,String type){
        this.hanFeiZi=hanFeiZi;
        this.lisi=lisi;
        this.type=type;
    }
    public void run(){
        while(true){
           if(this.type.equals("breakfast")){
               if(this.hanFeiZi.isHaveBreakfase){
                  this.lisi.update("韩非子在吃饭"); //探子观察到韩非子有动向,马上回报
                     //重置状态,继续监视
                     this.hanFeiZi.setHaveBreakfast(false);
               }
           }else{//监视韩非子娱乐的状态
                  this.lisi.update("韩非子在娱乐"); 
               this.hanFeiZi.setHaveFun(false);
           }
        }
    }
  
}


上面的代码很清晰,但是效率不高,因为探子必须一直监视他们

重点: 既然韩非子一吃饭李斯就知道,那我们为什么不把李斯这个类聚集到韩非子这个类上呢???(这让我想到了数据库中的两种表设计方式,第一种是建立第三方表来联系,在多对多时候用,第二种就是挂载哈。。。)

下面是李斯病毒入侵韩非子

public class HanFeiZi {
   private LiSi lisi = new Lisi();
   public void haveBreakfast(){//连监视标志位都不需要了
      System.out.println("韩非子开始吃饭了。。");
     this.liSi.update("韩非子在吃饭"); //韩非子一吃饭就被李斯知道,呵呵,李斯果然是韩非子肚子里面的蛔虫
  }
  public void haveFun(){
      System.out.println("韩非子开始娱乐了。。");
      this.liSi.update("韩非子在娱乐");
  }
}


//呵呵。。。。但是如果向韩非子这样的人不只是李斯想偷窥呢。。很多人都想监视韩非子啊,怎么办。。。。

给韩非子加开后门(黑客常常这么做)
public interface Observable{ //给被观察者添加的后面,注意啦,接口在给类扩展功能的同时当然也为自己打开了后门,病毒可以通过此地入侵。。恩恩,这是接口的副作用,被李斯利用了
    public void addObserver(Observer oberserver);
   public void deleteObserver(Observer observer);
   public void notifyObservers(String context);  
}


public class HanFeiZi implements Observable{
   private ArrayList<Observer> list = new ArrayList<Observer>();
   public void addObserver(Observer o){
       this.list.add(o);
   }
   public void deleteObserver(Observer o){
       this.list.remove(o);
   }
   public void nofifyObservers(String context){
       for(Observer o:list){
          o.update(context);
       }
   }
   
   public void haveBreakfast(){
       System.out.println("韩非子开始吃饭了");
       this.notifyObservers("韩非子开始吃饭了");
   }
   public void haveFun(){
      System.out.println("韩非子开始娱乐了");
       this.notifyObservers("韩非子开始娱乐了");
   }
}

是不是很完美啊。。。。但是jdk提供了这些东西,但是他把Observable后面做成了抽象类而不是接口。。。这样做比较好,因为后门本来就不应该显示的出现在韩非子的类中,当然啦,韩非子自己提供后面那不是有毛病啊。。。。

下面使用jdk

public class HanFeiZi extends Observable{
   public void haveBreakfast(){
         System.out.println("韩非子吃饭");
         super.setChanged(); //就是设置标志位
          super.notifyObservers("韩非子在吃饭");
   }

   public void haveFun(){
     ......同理 
  }
}

public class LiSi implements Observer{
   public void update(Observale o,Object msg){
        //这里不但可以得到情报,还可以得到被观察者对象。。
      。。。想怎么搞就怎么搞
   }
}

ATM 机器上取钱,多次输错密码,卡就会被ATM吞掉,吞卡动作发生的时候,会触发哪些事件呢?第一摄像头连续快拍,第二,通知监控系统,吞卡发生;第三,初始化ATM 机屏幕,返回最初状态----全都用的是观察者哈


分享到:
评论

相关推荐

    设计模式--观察者模式java例子

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...

    JAVA-设计模式-行为型模式-观察者模式

    JAVA-设计模式-行为型模式-观察者模式

    Android设计模式--观察者模式DEMO

    Android设计模式--观察者模式DEMO 观察者模式是一个使用频率非常高的模式,他最常用的地方是GUI系统和订阅-发布系统。 该模式的最重要的作用就是解耦,使观察者和被观察者之间依赖尽可能小,甚至好无依赖。

    设计模式-观察者模式-作业-observer.zip

    观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或发布-...

    C++设计模式--观察者模式 demo

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它在C++中的应用广泛且实用。这种模式的核心思想是“主体”(Subject)与“观察者”(Observer)之间的松耦合关系,允许一个对象(即主体)的状态...

    C++设计模式--基于Qt4开源跨平台开发框架

    行为型模式如观察者模式(Observer)、策略模式(Strategy)和访问者模式(Visitor),关注对象之间的交互和责任分配。 在C++中,设计模式的应用通常涉及到面向对象编程的特性,如继承、封装和多态。Qt4框架则为...

    跟我一起学 设计模式-观察者模式

    观察者模式,也称为发布-订阅模式或事件驱动模式,是一种行为设计模式,它定义了对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 在C#、ASP.NET等.NET框架中,...

    c++设计模式-行为型模式-观察者模式

    c++设计模式-行为型模式-观察者模式;qt工程;c++简单源码; 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式...

    Java 设计模式-观察者模式(Observer)

    结合微信公众号讲解观察者模式,生动形象,关键是上手快啊

    设计模式--观察者 c++版本

    观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心思想是主体(Subject)与观察者(Observer)之间的...

    C++设计模式-基于QT4开源跨平台开发框架 源码

    3. **观察者模式** - QT4的信号和槽机制是观察者模式的实现。当一个对象的某个状态改变时,它可以发出信号,其他对象可以通过连接这些信号并定义槽函数来响应这些变化,实现了事件驱动的编程模型。 4. **装饰器模式...

    设计模式系列博客--观察者模式

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的系统或者...

    设计模式实现——观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现发布-订阅...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 观察者模式(Observer):定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。 - 状态模式(State):允许对象在其内部状态改变时改变它的行为。 - ...

    游戏设计2-观察者模式的应用-攻击

    游戏设计中的观察者模式是一种行为设计模式,它允许对象在状态改变时通知其他对象,而无需显式地引用它们。这种模式广泛应用于游戏开发中,特别是在处理事件驱动和多对象交互的场景。在这个"游戏设计2-观察者模式的...

    Java设计模式----通俗易懂版

    - 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。 - 状态模式:允许对象在其内部状态改变时改变它的行为,看起来好像对象改变了它的...

    设计模式-观察者模式 基于MFC实现的消息监听机制

    基于MFC实现的消息监听机制,利用了设计模式中的观察者模式,对线程间的同步做了优化,以及可以选择消息的发送类型:同步或异步发送。对于监听者而言在注册监听的同时可以选择监听的消息类型,避免了发送者发送的...

    设计模式专题之(十八)观察者模式---设计模式观察者模式示例代码(python--c++)

    观察者模式是软件设计模式中的一种行为模式,它允许一个对象,称为"主题",维护一个依赖于它的对象列表,这些对象被称为"观察者"。当主题的状态发生改变时,它会通知所有观察者,使它们能够自动更新自己。这种模式在...

    设计模式课件大全

    PPT内容包括:内附代码,实例,方便理解。 继承、封装、多态、UML ...设计模式15-观察者模式、状态模式 设计模式16-策略模式、模板方法、访问者 此PPT实例便于理解,对于深入理解OO思想有很大帮助。

    软件设计模式--填空题+简答题(复习7).rar

    设计模式通常分为三类:创建型模式(如工厂方法、抽象工厂、单例、建造者、原型)、结构型模式(如适配器、桥接、装饰、组合、代理、外观、享元)和行为型模式(如责任链、命令、解释器、迭代器、访问者、备忘录、...

Global site tag (gtag.js) - Google Analytics