作業三:人才招聘系統中的觀察者模式
阿新 • • 發佈:2018-11-08
程式碼地址: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 { privatestatic 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):
第一、觀察者模式在被觀察者和觀察者之間建立一個抽象的耦合。被觀察者角色所知道的只是一個具體觀察者列表,每一個具體觀察者都符合一個抽象觀察者的介面。被觀察者並不認識任何一個具體觀察者,它只知道它們都有一個共同的介面。
由於被觀察者和觀察者沒有緊密地耦合在一起,因此它們可以屬於不同的抽象化層次。如果被觀察者和觀察者都被扔到一起,那麼這個物件必然跨越抽象化和具體化層次。
第二、觀察者模式支援廣播通訊。被觀察者會向所有的登記過的觀察者發出通知