标签:etc static set 电视 master 结构 void class spl
状态模式(State Pattern)又称为状态对象模式,该模式允许一个对象在其内部状态改变的时候改变行为。
英文:Allow an object to alert its behavior when its internal state changes.The object will appear to change its class.
翻译:允许一个对象内在状态发生改变时改变行为,使得这个对象看起来像改变了类型。
状态模式的核心是封装,状态的变更引起行为的变动,从外部看来就好像该对象对应的类发生改变一样。
角色
抽象状态(State)角色:该角色用以封装环境的一个特定的状态所对应的行为。
具体状态(Concrete State)角色:该角色实现环境的某一个状态所对应的行为。
环境(Context)角色:该角色定义客户端需要的接口,并负责具体状态的切换。它会保留一个具体状态类的实例,该实例给出环境对象的现有状态。
/** * 抽象状态 */ public abstract class State { //定义一个环境角色 protected Context context; //设置环境 public void setContext(Context context){ this.context = context; } //抽象行为 public abstract void handle(); } /** * 具体状态 */ public class ConcreteState1 extends State { //状态1的行为逻辑处理 @Override public void handle() { System.out.println("行为一的逻辑处理"); } } /** * 具体状态2 */ public class ConcreteState2 extends State { //状态2的行为逻辑处理 @Override public void handle() { System.out.println("行为二的逻辑处理"); } } /** * 环境角色 */ public class Context { //定义状态 public static State STATE1 = new ConcreteState1(); public static State STATE2 = new ConcreteState2(); //当前状态 private State currentState; //获取当前状态 public State getCurrentState() { return currentState; } //设置当前状态 public void setCurrentState(State currentState) { this.currentState=currentState; //设置状态的环境 currentState.setContext(this); } //行为委托 public void handle1(){ //切换到状态1 this.setCurrentState(STATE1); this.currentState.handle(); } //行为委托 public void handle2(){ //切换到状态2 this.setCurrentState(STATE2); this.currentState.handle(); } } public class Main { public static void main(String[] args) { //定义环境角色 Context context = new Context(); //执行行为 context.handle1(); context.handle2(); } }
从运行结果看,状态模式隐藏了状态的变化过程,状态的变化引起行为的变化。在外只能看到行为的变化,而不用知道是状态变化引起的。
/** * 频道(抽象状态) */ public interface Channel { //播放频道中的节目 public void display(); } /** * 具体状态 */ public class CCTV1 implements Channel { @Override public void display() { System.out.println("CCTV1正在播放新闻联播"); } } /** * 具体状态 */ public class CCTV2 implements Channel { @Override public void display() { System.out.println("CCTV2正在播放动物世界"); } } /** * 具体状态 */ public class CCTV6 implements Channel { @Override public void display() { System.out.println("CCTV6正在播放电影"); } } /** * 电视--环境角色 */ public class TV { private Channel channel1 = new CCTV1(); private Channel channel2 = new CCTV2(); private Channel channel6 = new CCTV6(); //当前频道 private Channel curChanel; public Channel getCurChanel() { return curChanel; } public void setCurChanel(Channel curChanel) { this.curChanel = curChanel; } public void displayCCTV1(){ this.setCurChanel(channel1); this.curChanel.display(); } public void displayCCTV2(){ this.setCurChanel(channel2); this.curChanel.display(); } public void displayCCTV6(){ this.setCurChanel(channel6); this.curChanel.display(); } } public class Main { public static void main(String[] args) { TV tv = new TV(); tv.displayCCTV1(); System.out.println("CCTV1播放广告"); tv.displayCCTV2(); System.out.println("就是想换台"); tv.displayCCTV6(); } }
标签:etc static set 电视 master 结构 void class spl
原文地址:https://www.cnblogs.com/aeolian/p/8952669.html