我正在编写一个使用观察者模式的应用程序。客户端类需要知道Employee对象的状态何时更改。它还需要知道当前员工的状态(在进行任何更新之前)。目前我正在使用getEmployee()方法,然后注册一个员工观察员:
public class MyClass implements EmployeeObserver{
...
Employee employee= subjectClass.getEmployee();
subjectClass.registerEmployeeObserver(this);
...
}
组合这些方法是否有任何问题,以便在观察者注册的同一方法调用中返回Employee对象? :
Employee employee = subjectClass.getAndObserveEmployee(this);
我知道这看起来有点奇怪,但是我只需要在初始化观察者类时使用getEmployee方法,并且subjectClass已经有了一个我希望保持最小的大型接口。那么,将两个动作组合成单个方法调用是否可以接受或是不好的做法?
答案 0 :(得分:0)
将两者分开是比较干净的。
另外,为什么Employee
本身没有addObserver()
方法?可能有一个完全正确的理由,但如果我正在搜索它,那将是我第一次猜到在哪里找到它。要么管理员工,要么有addObserver(int employeeIdToObserver)
或类似的事情(暗示您在观察员工之前已经有了对员工的引用。)
此外,您可以编写模式的一种方法是......
public interface EmployeeObserver {
public void stateChanged(State oldState, State newState);
}
...对于需要知道改变前的状态是什么的观察者。
答案 1 :(得分:0)
如果有时您不需要该员工
subjectClass.getAndObserveEmployee(this);
看起来很奇怪。或者如果有时你需要雇员而不是注册:
Employee employee = subjectClass.getAndObserveEmployee(null);
再次不好。如果,假设您要更改register
部分(即另外一个arg),则必须仅为get()
更改您使用该函数的位置。
我不会这样做,除非必要,如
oldVal = ConcurrentMap.replaceValue();
在这种情况下,两个操作必须在一个方法中组合,因为在两个调用之间的并发系统中,状态可以改变。