求职招聘项目中观察者模式解析

观察者模式

观察者模式是对象的行为模式,又叫发布-订阅(Publish-Subscribe)模式。这是一种非常有用的设计模式,生活中我们使用的应用程序涉及到依赖关系的非常多,那么就非常适合用观察者模式来实现。这种模式主要应用于对象之间一对多关系时,当一个对象发生改变时,多个对该对象有依赖的其他对象也会跟着做出相应的改变。使用观察者模式可以根据需要增加或删除对象,解决一对多对象间的耦合关系,使程序易于扩展和维护。

下面是GitHub上的一个关于求职招聘项目的观察者模式解析

项目代码链接:https://github.com/habren/JavaDesignPattern/commit/b35cb470512343c68deac5039394045b54c661f3#diff-0a780fc89991beff04d3bd322fc808aa

 

通俗地说观察者模式,其实就是观察者被观察者之间牵扯到的一些关系。在这个招聘求职项目中,HR或者说猎头就相当于被观察者,我们又称之为观察目标,而求职人员如:建筑师、初级工程师或者高级工程师就相当于观察者,时刻观察着职位的变化,一旦有新的工作信息发布,便会马上通知观察者,观察者也经常会做出相应的反应。

 

一、首先说下观察者模式的定义:

观察者模式定义了对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都会接收到通知。

在本项目中,猎头就相当于,而求职者们就相当于,每次猎头这个目标对象的状态发生变化,就会通知众多的观察者(求职者),求职者们一般也会做出对应的响应。

 

二、观察者模式主要解决的问题:一方的状态发生了变化,依赖于这一方的观察者立即能收到通知。

常见的比如消息通知,向用户发送一个消息需要同时通知到站内信、邮件、短信等多种消息,这种一对多的情况就非常适合用观察者模式来实现。

例如我们平时使用的新浪微博,在微博里我们会关注微博大V,只要他们发布新的微博,我们刷新便可以在分组或者首页收到他们的新发布。

这里需要注意的是,目标对象会把状态的变化通知所有观察者,而不管观察者的具体身份,而他们自己也并不知道通知的这个人究竟是谁。

 

三、观察者模式结构图

  

四、观察者模式一般的代码实现:

1.目标对象与具体目标对象代码示例

public abstract class AbstractHR { 
//定义一个观察者集合用于存储所有观察者对象

  protected Collection<ITalent> allTalents = new ArrayList<ITalent>(); 
//声明抽象通知方法

  public abstract void publishJob(String job); 

  public void addTalent(ITalent talent) { 
//注册方法,用于向观察者集合中增加一个观察者
    allTalents.add(talent); 
  } 

  public void removeTalent(ITalent talent) { 
//注销方法,用于在观察者集合中删除一个观察者
allTalents.remove(talent); 


//具体目标类HeadHunter是实现了抽象目标类AbstractHR的一个具体子类
//其具体代码如下所示:
public class HeadHunter extends AbstractHR { 
    
  public void publishJob(String job) { 
//调用每一个观察者的响应方法
    allTalents.forEach(talent -> talent.newJob(job)); 
  } 

} 

 

2.观察者与具体观察者代码实现 

public interface ITalent { 
//声明响应方法

  void newJob(String job); 

} 

以观察者Architect为例,JuniorEngineer、SeniorEngineer同理
//在具体观察者Architect中实现了newJob ()方法
//其典型代码如下所示:
public class Architect implements ITalent { 

  private static final Logger LOG = LoggerFactory.getLogger(Architect.class); 

 //实现响应方法
  public void newJob(String job) { 
    LOG.info("Architect get new position {}", job); 
  } 

} 

 

五、优点:

1、从这个项目中我们可以看出观察者和被观察者是抽象耦合的,只有轻微的关联关系;

2、建立一套触发机制。被观察者一旦发生变化,便会触发广播通知,观察者一旦收到通知,也会触发相应的响应。

 

六、缺点:

1、如果一个被观察者对象有很多的直接和间接的观察者的话,那么所有的观察者都通知到会花费很多时间。

2、如果在观察者和观察目标之间有循环依赖的话,当触发它们之间进行循环调用时,可能会导致系统崩溃。

3、观察者模式无法使观察者知道所观察的目标对象是内部变化过程,而仅仅只是知道观察目标发生了变化。

 

posted @ 2018-10-21 21:34  子不语m  阅读(310)  评论(0编辑  收藏  举报