记一次在项目中应用观察者模式的失败尝试

学了观察者模式,想在最近这次重写项目的时候尝试运用下。

场景是这样的,对象项目(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);
         }
      });
 
   }

又卡在注入上面。。感觉可能真的不适合这么“硬”用

猜你喜欢

转载自my.oschina.net/u/2351812/blog/1784761