首页 > 编程语言 > 详细

Java设计模式之观察者模式

时间:2020-02-11 23:25:14      阅读:75      评论:0      收藏:0      [点我收藏+]


第一、原理:主要是两块,第一块是被观察者,主要是将观察者加入到自己的队列,然后回调观察者的方法;第二块是观察者,主要实现在被被观察者回调后要做的事情

第二、使用场景:当一个数据变化的同时需要通知其他的地方做相应的修改,比如mq消息,主不过现在主流的消息中间件都有注册中心,这里的示例没有注册中心一说,是由被观察者负责将观察者注册进来

第三、举例:张三和李四同时购买了彩票,他们都需要收到彩票中心的中奖信息才能知道自己有没有中奖。这个案例中张三和李四就是观察者,彩票中心就是被观察者;只不过现实中我们是主动去查中奖信息,这里假设彩票中心会发送中奖号码给购买彩票的人


第四、设计代码逻辑:

1)首先我们先把观察者创建好,我们先建一个接口为叫Human,建一个抽象方法叫doSomething;这样方便实现类个性化实现自己的逻辑;

2)建好以后我们开始建立彩票消息中心也就是被观察者,根据面向接口原则,我们先创建一个接口叫LuckySubject,主要声明三个方法,添加观察者,删除观察者,通知消息;然后编写实现类LuckySubjectImpl,增加私有变量来存储添加注册进来的观察者并实现三个方法,说白了就是将观察者对象通过添加观察者方法存贮到LuckySubjectImpl的变量中,然后在通知消息方法实现中去回调观察者的doSomething方法,下边看代码:

======================================
//首先创建观察者接口
public interface Human {
void doSomething(String message);
}
=========================================
//李四作为具体的观察者进行实现
public class Lisi implements Human {
  @Override
  public void doSomething(String message) {
    if (message.equals("12 25 1 4 23 06")) {
      System.out.println("李四中奖了!");
     }else {
        System.out.println("李四没有中奖!");
        }
  }
}
=============================================
//张三作为具体的观察者进行实现
public class Zhangsan implements Human {
  @Override
  public void doSomething(String message) {
    if (message.equals("10000")) {
      System.out.println("张三中奖了!");
    }else {
      System.out.println("张三没有中奖!");
      }
   }
}
=======================================================
//创建被观察者的接口
public interface LuckySubject {
  void registerObserver(Human human);
  void remove(Human human);
  void notifyObserver(String message);
}
========================================================
//被观察者实现类
public class LuckySubjectImpl implements LuckySubject {
  //添加私有变量用来存储观察者
  private List<Human> humanList;
    //构造方法初始化存储
    public LuckySubjectImpl(){
      humanList = new ArrayList<>();
    }
  //将观察者注册存储
  @Override
  public void registerObserver(Human human) {
      humanList.add(human);
  }
  //将观察者从存储中去掉
  @Override
  public void remove(Human human) {
    if (humanList.size() != 0) {
      humanList.remove(human);
    }
  }
  //消息发生变化回调观察者的doSomething方法,实现通知的目的
  @Override
  public void notifyObserver(String message) {
    humanList.forEach(human -> human.doSomething(message));
  }
  //测试类
  public static void main(String[] args) {
    LuckySubjectImpl subject = new LuckySubjectImpl();
    //这里需要手动注册,如果增加新的human实现类就需要手动添加
    subject.registerObserver(new Lisi());
    subject.registerObserver(new Zhangsan());
    String message = "12 25 1 4 23 06";
    subject.notifyObserver(message);
  }
}

 

Java设计模式之观察者模式

原文:https://www.cnblogs.com/luckysword/p/12297175.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!