1. 程式人生 > >作業三:人才招聘系統中的觀察者模式

作業三:人才招聘系統中的觀察者模式

程式碼地址:https://github.com/habren/JavaDesignPattern/commit/b35cb470512343c68deac5039394045b54c661f3?diff=unified

 

首先定義觀察者介面 ITalent,當觀察者觀察到狀態變化(有新工作)時,會發出日誌資訊

package com.jasongj.observer;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Architect implements ITalent {
  
  private
static final Logger LOG = LoggerFactory.getLogger(Architect.class); @Override public void newJob(String job) { LOG.info("Architect get new position {}", job); } }

 

然後實現一個具體的觀察者類,比如一個高階工程師

package com.jasongj.observer;
 import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class JuniorEngineer implements ITalent { private static final Logger LOG = LoggerFactory.getLogger(JuniorEngineer.class); @Override public void newJob(String job) { LOG.info("Junior engineer get new position {}", job); } }

 

隨後定義被觀察者的虛擬類,AbstractHR。其中的allTalents容器代表觀察其的觀察者,addTalent用於新增觀察者,removeTalent用於移除觀察者

package com.jasongj.subject;
import java.util.ArrayList;
import java.util.Collection;
import com.jasongj.observer.ITalent;


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); } }

 

實現一個被觀察者類,它會具體實現publishJob方法,通過函式呼叫的方式通知allTalents容器中的每一個觀察者

package com.jasongj.subject;
 public class HeadHunter extends AbstractHR {
   @Override
  public void publishJob(String job) {
    allTalents.forEach(talent -> talent.newJob(job));
  }
 }

 

一個應用的例子

package com.jasongj.client;
import com.jasongj.observer.Architect;
import com.jasongj.observer.ITalent;
import com.jasongj.observer.JuniorEngineer;
import com.jasongj.observer.SeniorEngineer;
import com.jasongj.subject.HeadHunter;
import com.jasongj.subject.AbstractHR;


public class Client1 { public static void main(String[] args) { ITalent juniorEngineer = new JuniorEngineer(); ITalent seniorEngineer = new SeniorEngineer(); ITalent architect = new Architect(); AbstractHR subject = new HeadHunter(); subject.addTalent(juniorEngineer); subject.addTalent(seniorEngineer); subject.addTalent(architect); subject.publishJob("Top 500 big data position"); } }

 

 

好處(來自於:https://www.cnblogs.com/pjl1119/p/9727444.html):

第一、觀察者模式在被觀察者和觀察者之間建立一個抽象的耦合。被觀察者角色所知道的只是一個具體觀察者列表,每一個具體觀察者都符合一個抽象觀察者的介面。被觀察者並不認識任何一個具體觀察者,它只知道它們都有一個共同的介面。

由於被觀察者和觀察者沒有緊密地耦合在一起,因此它們可以屬於不同的抽象化層次。如果被觀察者和觀察者都被扔到一起,那麼這個物件必然跨越抽象化和具體化層次。

第二、觀察者模式支援廣播通訊。被觀察者會向所有的登記過的觀察者發出通知