我会尝试解释我在汽车上的问题.我有AbstractCar,我的库的用户(开发人员)将创建许多他们的ConcreteCars.这个AbstractCar有状态,这个状态对于图书馆的正确工作非常重要!只有汽车可以控制其状态(没有任何司机等).方法的状态变化在方法的开始和结束时开始/停止.除了所有汽车必须实现接口汽车.
public enum State{ STARTING, STARTED, STOPPING, STOPPED } public interface Car{ public void start(); public void stop(); public State getState(); }
我尝试了两种变体.
变式1
public abstract class AbstractCar implements Car{ private State state; public void setState(State state){...} public State getState(){...} } public class ConcreteCar extends AbstractCar{ @Override public void start(){ setState(stateK); ... setState(stateN); } @Override public void stop(){ setState(stateR); ... setState(stateO); } }
在变体1中,库的用户必须记住改变状态.如果他忘记这样做,那么代码中就会出现错误.
变体2
public abstract class AbstractCar implements Car{ private State state; protected void doOnStart(){ } protected void doOnStop(){ } public final void start(){ state=...; doOnStart(); state=...; } public final void stop(){ state=...; doOnStop(); state=...; } } public class ConcreteCar extends AbstractCar{ @Override protected void doOnStart(){ .... } @Override protected void doOnStop(){ ... } }
在变体2中,用户不能忘记状态,因为它已经超出了他的控制范围,但是如果我有许多状态和许多可以改变它们的方法,这不是一个非常好的方法.
任何人都可以建议任何模式或技术如何解决这样的问题?