作业三:人才招聘系统中的观察者模式
代码地址: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):
第一、观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。
由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。如果被观察者和观察者都被扔到一起,那么这个对象必然跨越抽象化和具体化层次。
第二、观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知

浙公网安备 33010602011771号