状态模式是一种行为设计模式,它使对象能够在运行时更改其行为,根据对象的状态改变其执行的动作。这种模式将特定的行为与状态相关联,使得当对象状态改变时,其行为也会相应地变化,而无需修改对象的结构。 在给定的例子中,我们有一个`People`类,该类代表一个人,根据他的薪水有不同的看法。最初的设计使用了大量的`if`语句来判断不同薪资范围对应的看法。然而,这种设计存在一个问题,即如果要改变判断的标准(比如不同薪资对应的不同看法),我们需要修改`People`类的代码,这违反了开闭原则——软件实体应该对扩展开放,对修改关闭。 为了解决这个问题,我们可以引入状态模式。定义一个`State`接口,它包含一个`say()`方法,这个方法会根据状态来输出相应的信息。然后,我们可以创建多个实现了`State`接口的类,每个类代表一种特定的状态,例如`StateOne`、`StateTwo`等,它们各自实现`say()`方法,表示不同薪资范围的状态。 ```java // 状态接口 public interface State { public void say(); } // 状态一,薪资非常少 public class StateOne implements State { private int salary; // 构造器,设置薪资 public StateOne(int salary) { this.salary = salary; } // 输出对应状态的信息 @Override public void say() { System.out.println("薪水非常少!"); } } // 类似地,可以创建更多状态类,如StateTwo、StateThree等 ``` 接下来,`People`类不再直接处理薪资和输出信息的关系,而是持有一个`State`对象,通过`setState(State state)`方法来改变状态,`say()`方法则委托给当前的状态对象执行。 ```java public class People { private State state; public State getState() { return state; } public void setState(State state) { this.state = state; } public void say() { state.say(); } } ``` 在测试类`TestState`中,我们可以根据需要为`People`对象设置不同的状态,从而改变它的行为: ```java public class TestState { public static void main(String[] args) { People people = new People(); people.setState(new StateOne(5000)); // 设置状态 people.say(); // 输出状态对应的信息 } } ``` 通过这种方式,状态模式使得程序更加灵活,易于扩展。当我们需要添加新的薪资看法或改变现有看法时,只需创建新的状态类或修改已有的状态类,而无需改动`People`类本身。这种解耦使得代码更易于维护,也符合面向对象设计的原则。
- 粉丝: 40
- 资源: 67
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- js-leetcode题解之158-read-n-characters-given-read4-ii-call
- js-leetcode题解之157-read-n-characters-given-read4.js
- js-leetcode题解之156-binary-tree-upside-down.js
- js-leetcode题解之155-min-stack.js
- js-leetcode题解之154-find-minimum-in-rotated-sorted-array-ii.js
- js-leetcode题解之153-find-minimum-in-rotated-sorted-array.js
- js-leetcode题解之152-maximum-product-subarray.js
- js-leetcode题解之151-reverse-words-in-a-string.js
- js-leetcode题解之150-evaluate-reverse-polish-notation.js
- js-leetcode题解之149-max-points-on-a-line.js