常用程序模式-LifeCycle模式
场景
当我们要监控一个组件的生命周期的时候,比如,启动时,启动后,关闭前,关闭后
实现
LifeCycleModule
public interface LifeCycleModule {/*** 获取当前状态* @return*/LifeCycle.State getCurrentState();/*** add listener* @param listener*/void addListener(LifeCycleListener listener);/*** 启动*/void start();/*** 停止*/void stop();/*** 关闭*/void close();
}
AbstractLifeCycleModule:
public abstract class AbstractLifeCycleModule implements LifeCycleModule {private LifeCycle lifeCycle = new LifeCycle();private List<LifeCycleListener> listeners = new ArrayList<>();@Overridepublic LifeCycle.State getCurrentState() {return lifeCycle.getState();}@Overridepublic void addListener(LifeCycleListener listener) {listeners.add(listener);}@Overridepublic void start() {synchronized (lifeCycle){if (!lifeCycle.canChangeToStart()){return;}for (LifeCycleListener listener : listeners) {listener.beforeStart();}doStart();lifeCycle.changeToStarted();for (LifeCycleListener listener : listeners) {listener.afterStart();}}}protected abstract void doStart();@Overridepublic void stop() {synchronized (lifeCycle){if (!lifeCycle.canChangeToStop()){return;}for (LifeCycleListener listener : listeners) {listener.beforeStop();}doStop();lifeCycle.changeToStop();for (LifeCycleListener listener : listeners) {listener.afterSop();}}}protected abstract void doStop();@Overridepublic void close() {synchronized (lifeCycle){if (!lifeCycle.canChangeToClose()){return;}for (LifeCycleListener listener : listeners) {listener.beforeClose();}lifeCycle.changeToClosed();try {doClose();}catch (Exception e){throw new RuntimeException(e);}finally {for (LifeCycleListener listener : listeners) {listener.afterClose();}}}}protected abstract void doClose();
}
LifeCycleListener
public interface LifeCycleListener {/*** 在开始之前*/void beforeStart();/*** 在开始之后*/void afterStart();/*** 在停止之前*/void beforeStop();/*** 在停止之后*/void afterSop();/*** 在关闭之前*/void beforeClose();/*** 在关闭之后*/void afterClose();
}
LifeCycle 状态管理
public class LifeCycle {private volatile LifeCycle.State state = State.INIT;public LifeCycle.State getState() {return state;}public boolean canChangeToStart() {State curState = this.state;if (curState == State.INIT || curState == State.STOP) {return true;}if (curState == State.START) {return false;}if (curState == State.CLOSE) {throw new IllegalArgumentException("can not move close to start");}throw new IllegalArgumentException("illegal state");}public synchronized boolean changeToStarted() {State curState = this.state;if (curState == State.INIT || curState == State.STOP) {state = State.START;return true;}return false;}public boolean canChangeToClose() {State curState = this.state;if (curState == State.CLOSE) {return false;}return true;}public synchronized boolean changeToClosed() {State curState = this.state;if (curState == State.CLOSE) {return false;}state = State.CLOSE;return true;}public boolean canChangeToStop() {State curState = this.state;if (curState == State.START) {return true;}return false;}public synchronized boolean changeToStop() {State curState = this.state;if (curState == State.START) {state = State.STOP;return true;}return false;}enum State {INIT, START, STOP, CLOSE}public boolean initialized() {return this.state == State.INIT;}public boolean started() {return this.state == State.START;}public boolean stopped() {return this.state == State.STOP;}public boolean closed() {return this.state == State.CLOSE;}}
测试
@Slf4j
public class WebServer extends AbstractLifeCycleModule{public WebServer(){addListener(new WebServerListener());}@Overrideprotected void doStart() {log.info("{} doStart", Thread.currentThread().getName());}@Overrideprotected void doStop() {log.info("{} doStop", Thread.currentThread().getName());}@Overrideprotected void doClose() {log.info("{} doClose", Thread.currentThread().getName());}static class WebServerListener implements LifeCycleListener{@Overridepublic void beforeClose() {log.info("{} before close", Thread.currentThread().getName());}@Overridepublic void afterClose() {log.info("{} after close", Thread.currentThread().getName());}@Overridepublic void beforeStart() {log.info("{} before start", Thread.currentThread().getName());}@Overridepublic void afterStart() {log.info("{} after start", Thread.currentThread().getName());}@Overridepublic void beforeStop() {log.info("{} before stop", Thread.currentThread().getName());}@Overridepublic void afterSop() {log.info("{} after stop", Thread.currentThread().getName());}}public static void main(String[] args) throws InterruptedException {WebServer webServer = new WebServer();webServer.start();TimeUnit.SECONDS.sleep(1);webServer.stop();TimeUnit.SECONDS.sleep(1);webServer.close();}
}
结果:
INFO com.example.lifecycle.WebServer -- main before start
INFO com.example.lifecycle.WebServer -- main doStart
INFO com.example.lifecycle.WebServer -- main after start
INFO com.example.lifecycle.WebServer -- main before stop
INFO com.example.lifecycle.WebServer -- main doStop
INFO com.example.lifecycle.WebServer -- main after stop
INFO com.example.lifecycle.WebServer -- main before close
INFO com.example.lifecycle.WebServer -- main doClose
INFO com.example.lifecycle.WebServer -- main after close