[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f7531u3X5ZXJuT2cfpeC4mazsh3np0dOHMSS8qik77bQ":3},{"answer":4,"createTime":5,"id":6,"options":7,"origin":12,"question":19,"related":20,"source":30,"type":31},[],"2024-05-21 20:38:40",145140693,[8,9,10,11],"银行账户根据余额不同拥有不同的存取款操作","游戏软件中根据虚拟角色级别的不同拥有不同的权限","某软件在不同的操作系统中呈现不同的外观","会员系统中会员等级不同可以实现不同的行为",{"count":13,"courseId":14,"courseImg":15,"courseName":16,"workId":17,"workName":18},7,"24e9b4667f359b291a0d76a81ee8fdb7","https:\u002F\u002Ftihai-oss-cloud.itihey.com\u002Fimg\u002Fcd6aa804f56468e1fa7bc4a2057046b9.png","软件体系结构与设计模式","work_35189525","实验11-策略模式和状态模式","场景( )不是状态模式的实例",[21,32,41,44,53,60,68],{"answer":22,"createTime":5,"id":23,"options":24,"question":29,"source":30,"type":31},[],145140691,[25,26,27,28],"策略模式是对算法的包装,是把算法的责任和算法本身分隔开,委派给不同的对象管理","在Context类中,维护了对各个ConcreteStrategy的引用实例,提供了一个接口供ConcreteStrategy存储数据","策略模式让算法独立于使用它的客户而变化","策略模式中,定义一系列算法,并将每一个算法封装起来,并让它们可以相互替换","以下关于策略模式叙述错误的是( )","v1",0,{"answer":33,"createTime":5,"id":34,"options":35,"question":40,"source":30,"type":31},[],145140692,[36,37,38,39],"策略模式中,客户端无须知道所有的策略类,系统必须自行提供一个策略类","策略模式可以避免使用多重条件转移语句","策略模式会导致产生大量的策略类","策略模式提供了管理相关算法族的办法","以下关于策略模式的优缺点描述错误的是( )",{"answer":42,"createTime":5,"id":6,"options":43,"question":19,"source":30,"type":31},[],[8,9,10,11],{"answer":45,"createTime":5,"id":46,"options":47,"question":52,"source":30,"type":31},[],145140694,[48,49,50,51],"状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类","状态模式中引入了一个抽象类来专门表示对象的状态,而具体的状态都继承了该类,并实现了不同状态的行为,包括各种状态之间的转换","状态模式使得状态的变化更加清晰明了,也很容易创建对象的新状态","状态模式完全符合开闭原则,增加新的状态类无须对原有类库进行任何修改","以下关于状态模式叙述错误的是( )",{"answer":54,"createTime":55,"id":56,"options":57,"question":58,"source":30,"type":59},[],"2024-06-05 09:38:20",148814262,[],"某软件公司要为一银行开发一套信用卡业务系统,银行账户(Account)是该系统的核心类之一,通过分析,该 软件公司开发人员发现在系统中账户存在3种状态,且在不同状态下账户存在不同的行为,具体说明如下: (1) 如果账户中余额大于等于0,则账户的状态为正常状态(Normal State),此时用户既可以向该账户存款也可以从该账户取款; (2) 如果账户中余额小于0,并且大于-2000,则账户的状态为透支状态(Overdraft State),此时用户既可以向该账户存款也可以从该账户取款,但需要按天计算利息; (3) 如果账户中余额等于-2000,那么账户的状态为受限状态(Restricted State),此时用户只能向该账户存款,不能再从中取款,同时也将按天计算利息; (4) 根据余额的不同,以上3种状态可发生相互转换. 现使用状态模式设计并实现银行账户状态的转换.银行账户状态图如图1所示,类图如图2所示. \u003Cimg src=\"https:\u002F\u002Ftihai-oss-cloud.itihey.com\u002Fimg\u002F521abf0ebabdd3ecc5a2a7401e56e91e.png\"> 图1 银行账户状态图 \u003Cimg src=\"https:\u002F\u002Ftihai-oss-cloud.itihey.com\u002Fimg\u002Fadd3273abbfee1f0a3ff00d266b03beb.png\"> 图2 类图 【Java代码】 \u002F\u002F银行账户:环境类 public class Account { private (1) state; \u002F\u002F维持一个对抽象状态对象的引用 private String owner; \u002F\u002F开户名 private double balance = 0; \u002F\u002F账户余额 public Account(String owner,double init) { this.owner = owner; this.balance = balance; this.state = new NormalState(this); \u002F\u002F设置初始状态 System.out.println(this.owner + &quot;开户,初始金额为&quot; + init); System.out.println(&quot;---------------------------------------------&quot;); } public double getBalance() { return this.balance; } public void setBalance(double balance) { this.balance = balance; } public void setState(AccountState state) { this.state = state; } \u002F\u002F存款 public void deposit(double amount) { System.out.println(this.owner + &quot;存款&quot; + amount); state.deposit(amount); \u002F\u002F调用状态对象的deposit()方法 System.out.println(&quot;现在余额为&quot;+ this.balance); System.out.println(&quot;现在帐户状态为&quot;+ this.state.getClass().getName()); System.out.println(&quot;---------------------------------------------&quot;); } \u002F\u002F取款 public void withdraw(double amount) { System.out.println(this.owner + &quot;取款&quot; + amount); state.withdraw(amount); \u002F\u002F调用状态对象的withdraw()方法 System.out.println(&quot;现在余额为&quot;+ this.balance); System.out.println(&quot;现在帐户状态为&quot;+ this. state.getClass().getName()); System.out.println(&quot;---------------------------------------------&quot;); } \u002F\u002F计息 public void computeInterest() { state.computeInterest(); \u002F\u002F调用状态对象的computeInterest()方法 } } \u002F\u002F抽象状态类 public abstract class AccountState { protected (2) acc; public abstract void deposit(double amount); public abstract void withdraw(double amount); public abstract void computeInterest(); public abstract void stateCheck(); } \u002F\u002F正常状态:具体状态类 public class NormalState extends AccountState { public NormalState(Account acc) { (3) ; } public NormalState(AccountState state) { this.acc = state.acc; } public void deposit(double amount) { acc.setBalance(acc.getBalance() + amount); stateCheck(); } public void withdraw(double amount) { acc.setBalance(acc.getBalance() - amount); (4) ; } public void computeInterest() { System.out.println(&quot;正常状态,无须支付利息!&quot;); } \u002F\u002F状态转换 public void stateCheck() { if (acc.getBalance() &gt; -2000 &amp;&amp; acc.getBalance() &lt;= 0) { (5) ; } else if (acc.getBalance() == -2000) { acc.setState(new RestrictedState(this)); } else if (acc.getBalance() &lt; -2000) { System.out.println(&quot;操作受限!&quot;); } } } \u002F\u002F透支状态:具体状态类 public class OverdraftState extends AccountState { public OverdraftState(AccountState state) { this.acc = state.acc; } public void deposit(double amount) { acc.setBalance(acc.getBalance() + amount); stateCheck(); } public void withdraw(double amount) { acc.setBalance(acc.getBalance() - amount); stateCheck(); } public void computeInterest() { System.out.println(&quot;计算利息!&quot;); } \u002F\u002F状态转换 public void stateCheck() { if (acc.getBalance() &gt; 0) { acc.setState(new NormalStateState(this)) ; } else if (acc.getBalance() == -2000) { (6) ; } else if (acc.getBalance() &lt; -2000) { System.out.println(&quot;操作受限!&quot;); } } } \u002F\u002F受限状态:具体状态类 public class RestrictedState extends AccountState { public RestrictedState(AccountState state) { (7) ; } public void deposit(double amount) { acc.setBalance(acc.getBalance() + amount); stateCheck(); } public void withdraw(double amount) { System.out.println(&quot;帐号受限,取款失败&quot;); } public void computeInterest() { System.out.println(&quot;计算利息!&quot;); } \u002F\u002F状态转换 public void stateCheck() { if(acc.getBalance() &gt; 0) { (8) ; } else if(acc.getBalance() &gt; -2000) { acc.setState(new OverdraftState(this)) ; } } } \u002F\u002F客户类 public class Client { public static void main(String args[]) { Account acc = new Account(&quot;段誉&quot;,0.0); acc.deposit(1000); acc.withdraw(2000); acc.deposit(3000); acc.withdraw(4000); acc.withdraw(1000); acc.computeInterest(); } }",2,{"answer":61,"createTime":55,"id":62,"options":63,"question":66,"source":30,"type":67},[],148814264,[64,65],"正确","错误","策略模式的环境类中可以包含多个不同抽象策略类的引用",3,{"answer":69,"createTime":55,"id":70,"options":71,"question":72,"source":30,"type":73},[],148814266,[],"某软件公司现欲开发一款飞机模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征.需要模拟的飞机种类及其特征如表1所示. \u003Cimg src=\"https:\u002F\u002Ftihai-oss-cloud.itihey.com\u002Fimg\u002Fb664ae83f2337e86a423a0508267b96e.png\"> 为支持将来模拟更多种类的飞机,采用策略设计模式(Strategy)设计. 1、使用Java语言编程实现(15分) 2、根据代码画出UML类图.(15分) 3、说明该题使用策略模式的优点 .",4]