上海市城乡建设网站,外贸生意怎么入手,龙岩网站制作设计,网络服务主要包括哪些什么是状态模式 状态模式是指允许一个对象在其内部状态改变时改变他的行为#xff0c;对象看起来似乎改变了整个类。 状态模式将一个对象在不同状态下的不同行为封装在一个个状态类中#xff0c;通过设置不同的状态对象可以让环境对象拥有不同的行为#xff0c;而状…什么是状态模式 状态模式是指允许一个对象在其内部状态改变时改变他的行为对象看起来似乎改变了整个类。 状态模式将一个对象在不同状态下的不同行为封装在一个个状态类中通过设置不同的状态对象可以让环境对象拥有不同的行为而状态转换的行为对客户端是透明的。 状态模式主要包含以下几个角色 Context(环境)拥有多种状态的对象由于环境类的状态存在多样性且在不同状态下对象的行为有所不同因此将状态独立出来形成单独的状态类。 State(抽象状态类)定义一个接口以封装与环境类的一个特定相关行为在抽象状态类中声明了各种不同状态对应的方法而且在子类中都进行了实现。 ConcreteState(具体状态类)抽象状态类的子类每一个子类实现一个与环境类的一个状态相关的行为每一个具体状态类对应环境的一个具体状态。
状态模式的优缺点
优点 封装了状态的转换规则在状态模式中可以将状态的转换代码封装在环境类或者具体状态类中可以对状态转换代码集中管理。将所有与某个状态有关的行为放到一个类中只需要注入一个不同的状态对象即可使环境拥有不同的行为。允许状态转换逻辑和状态对象合成一体而不是提供一个巨大的条件语句块。可以让多个环境对象共享一个状态对象。
缺点 会增加系统中对象和类的个数导致系统运行开销大。状态模式的结构和实现较为复杂如果使用不当导致代码混乱。
状态模式的应用场景 对象的行为依赖于他的状态状态的改变将导致行为的改变。包含大量的与对象状态相关的条件语句。
状态模式的案例 // 抽象状态类
public abstract class State {/*** 扣除积分 - 50*/public abstract void deductMoney();/*** 是否抽中奖品** return boolean*/public abstract boolean raffle();/*** 发放奖品*/public abstract void dispensePrize();}// 具体状态类
public class NoRaffleState extends State {RaffleActivity activity;public NoRaffleState(RaffleActivity activity) {this.activity activity;}Overridepublic void deductMoney() {System.out.println(扣除50积分成功您可以抽奖了);activity.setState(activity.getCanRaffleState());}Overridepublic boolean raffle() {System.out.println(扣了积分才能抽奖喔);return false;}Overridepublic void dispensePrize() {System.out.println(不能发放奖品);}}public class CanRaffleState extends State {RaffleActivity activity;public CanRaffleState(RaffleActivity activity) {this.activity activity;}/*** 已经扣除了积分不能再扣*/Overridepublic void deductMoney() {System.out.println(已经扣取过了积分);}/*** 可以抽奖, 抽完奖后根据实际情况改成新的状态** return boolean*/Overridepublic boolean raffle() {System.out.println(正在抽奖请稍等);Random r new Random();int num r.nextInt(10);// 10%中奖机会if (num 0) {// 改变活动状态为发放奖品 contextactivity.setState(activity.getDispenseState());return true;} else {System.out.println(很遗憾没有抽中奖品);// 改变状态为不能抽奖activity.setState(activity.getNoRafflleState());return false;}}/*** 不能发放奖品*/Overridepublic void dispensePrize() {System.out.println(没中奖不能发放奖品);}
}public class DispenseOutState extends State {RaffleActivity activity;public DispenseOutState(RaffleActivity activity) {this.activity activity;}Overridepublic void deductMoney() {System.out.println(奖品发送完了请下次再参加);}Overridepublic boolean raffle() {System.out.println(奖品发送完了请下次再参加);return false;}Overridepublic void dispensePrize() {System.out.println(奖品发送完了请下次再参加);}}public class DispenseState extends State {RaffleActivity activity;public DispenseState(RaffleActivity activity) {this.activity activity;}Overridepublic void deductMoney() {System.out.println(不能扣除积分);}Overridepublic boolean raffle() {System.out.println(不能抽奖);return false;}Overridepublic void dispensePrize() {if (activity.getCount() 0) {System.out.println(恭喜中奖了);// 改变状态为不能抽奖activity.setState(activity.getNoRafflleState());} else {System.out.println(很遗憾奖品发送完了);// 改变状态为奖品发送完毕, 后面我们就不可以抽奖activity.setState(activity.getDispensOutState());}}
}// 环境类
public class RaffleActivity {State state;int count;State noRafflleState new NoRaffleState(this);State canRaffleState new CanRaffleState(this);State dispenseState new DispenseState(this);State dispensOutState new DispenseOutState(this);public RaffleActivity(int count) {this.state getNoRafflleState();this.count count;}public void debuctMoney() {state.deductMoney();}public void raffle() {// 如果当前的状态是抽奖成功if (state.raffle()) {//领取奖品state.dispensePrize();}}public State getState() {return state;}public void setState(State state) {this.state state;}public int getCount() {int curCount count;count--;return curCount;}public void setCount(int count) {this.count count;}public State getNoRafflleState() {return noRafflleState;}public void setNoRafflleState(State noRafflleState) {this.noRafflleState noRafflleState;}public State getCanRaffleState() {return canRaffleState;}public void setCanRaffleState(State canRaffleState) {this.canRaffleState canRaffleState;}public State getDispenseState() {return dispenseState;}public void setDispenseState(State dispenseState) {this.dispenseState dispenseState;}public State getDispensOutState() {return dispensOutState;}public void setDispensOutState(State dispensOutState) {this.dispensOutState dispensOutState;}}public static void main(String[] args) {// 创建活动对象奖品有1个奖品RaffleActivity activity new RaffleActivity(1);// 我们连续抽300次奖for (int i 0; i 30; i) {System.out.println(--------第 (i 1) 次抽奖----------);// 参加抽奖第一步点击扣除积分activity.debuctMoney();// 第二步抽奖activity.raffle();}
}