StatePattern(状态模式)
/** * 状态模式 * @author TMAC-J * 状态模式和策略模式很像,其实仔细研究发现完全不一样 * 策略模式各策略之间没有任何关系,独立的 * 状态模式各状态之间接口方法都是一样的 * 另外一个区别是状态模式主要用于状态经常发生改变的情况 * 策略模式发生在不改变的情况,策略模式一般在CONTEXT初始化时就决定了,并且中途不会改变 * 换句话说,策略模式只是在对象初始化的时候更改执行模式,而状态模式是根据对象实例的周期时间而动态地改变对象实例的执行模式。 * 状态模式的方法都是固定的,策略模式有不同的策略,可以随意些不同方法 * key:策略模式是可以扩展不同的策略算法,而状态模式是以继承代替if-else,可以扩展不同 * 情况,他能做的事情是固定不变的! * if-else特别多的时候用这种方式 */ public class StatePattern { /** * 这个接口负责定义所有的方法 * 功能在这个接口加 */ interface State{ void preChannel(); void nextChannel(); void turnon(); void turndown(); } public class PoweronState implements State{ @Override public void preChannel() { System.out.println("pre"); } @Override public void nextChannel() { System.out.println("next"); } @Override public void turnon() { System.out.println("turnon"); } @Override public void turndown() { System.out.println("turnoff"); } } public class PoweroffState implements State{ /** * 关机状态不做任何操作 */ @Override public void preChannel() { // TODO Auto-generated method stub } @Override public void nextChannel() { // TODO Auto-generated method stub } @Override public void turnon() { // TODO Auto-generated method stub } @Override public void turndown() { // TODO Auto-generated method stub } } /** * 这个接口负责定义不同状态 * 状态在这个接口加 */ interface PowerController{ void poweron(); void poweroff(); } /** * 需要写明不同的方法和不同的状态 * */ public class TVController implements PowerController{ private State state; public void setState(State state){ this.state = state; } @Override public void poweron() { setState(new PoweronState()); } @Override public void poweroff() { setState(new PoweroffState()); } public void preChannel() { state.preChannel(); } public void nextChannel() { state.nextChannel(); } public void turnon() { state.turnon(); } public void turndown() { state.turndown(); } } public class Client{ public void test(){ TVController tvController = new TVController();//这个时候只需要创建这个控制类就够啦 tvController.setState(new PoweronState());//传递状态,相当于if /** * 下面这四个直接写就可以了,不用管什么状态了,是不是很爽,到时候如果有不同的状态加入的话 * 只需要在控制器接口中添加相应的方法,或者是在写一个接口让控制器实现就可以啦 * 其他的都不用管!!! */ tvController.preChannel(); tvController.nextChannel(); tvController.turnon(); tvController.turndown();; } } }