學了觀察者模式,想在最近此次重寫項目的時候嘗試運用下。設計模式
場景是這樣的,對象項目(Project)中有個合同額,在第一次填寫以後,有可能還會更新,這時候要更新概算表(Estimate)跟預算表。按說這個簡單具體的需求不必用設計模式,就是嘗試硬用一下。mvc
首先肯定觀察者Observer跟被觀察者Subject,開始定的觀察者是Estimate,被觀察者是Project,後來發現定到Service層更合適些,Project能夠做爲具體的State變量傳遞,這點有點像以前的狀態模式。ide
由於jdk提供的Observable是個具體類,必須繼承才能用,這樣的話只有本身寫了,改用listener的命名方式,先定義接口。設計
public interface ProjectListener { public void onProjectChanged(Project project); }
而後在ProjectService裏寫被觀察者跟相關注冊,移除,通知的方法server
private List<ProjectListener> listeners = Lists.newArrayList(); public void registerProjectListener(ProjectListener projectListener) { listeners.add(projectListener); } public void unregisterProjectListener(ProjectListener projectListener) { listeners.remove(projectListener); } public void notifyAllListener(Project project) { for (ProjectListener projectListener:listeners) { projectListener.onProjectChanged(project); } }
接下來我就傻眼了,什麼時候註冊Listener呢,看書上是在main方法裏,開始的時候調用註冊方法註冊一次。如今放到mvc系統裏,什麼時候註冊呢,按理來講容器初始化的時候就能夠註冊了,可是在應用程序裏不知道該往哪裏寫對象
若是先不考慮這個,繼續看繼承
projectService.registerProjectListener(new ProjectListener() { @Override public void onProjectChanged (Project p) { //此處應該獲取到 對應的estimate並更新,可是問題來了,匿名類裏Service如何注入呢 esitimateService.getByProjectId(p.getId()); esitimateService.update(estimate); } }); }
又卡在注入上面。。感受可能真的不適合這麼「硬」用接口