学了观察者模式,想在最近这次重写项目的时候尝试运用下。
场景是这样的,对象项目(Project)中有个合同额,在第一次填写之后,有可能还会更新,这时候要更新概算表(Estimate)跟预算表。按说这个简单具体的需求没必要用设计模式,就是尝试硬用一下。
首先确定观察者Observer跟被观察者Subject,开始定的观察者是Estimate,被观察者是Project,后来发现定到Service层更合适些,Project可以作为具体的State变量传递,这点有点像之前的状态模式。
因为jdk提供的Observable是个具体类,必须继承才能用,这样的话只有自己写了,改用listener的命名方式,先定义接口。
public interface ProjectListener { public void onProjectChanged(Project project); }
然后在ProjectService里写被观察者跟相关注册,移除,通知的方法
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); } }); }
又卡在注入上面。。感觉可能真的不适合这么“硬”用