软件工程作业 第一周
关键词:命令模式
(完整代码在文章末尾)
作业要求:看别人写的小程序,了解该程序怎么运行,并对该程序进行重构。第二周周四之前提交到老师邮箱。
这次作业选择了网上的一个小程序 http://www.cnblogs.com/devinzhang/archive/2012/01/06/2315235.html
网友用Java写的一个小程序,利用Java 设计模式中的命令模式模拟电视机开机、关机、换台命令。
原程序运行结果如下图
该程序是Java的23个模式中之一命令模式的一个案例,原作者是为了熟悉Command Pattern
才设计的小程序,功能简单,仅实现模拟电视开关机和设定开机默认频道等功能。
现对原程序进行功能添加:
1.通过输入“+”模拟使用遥控器往上增加频道。
2.输入“-”模拟往下调低频道。
3.限定频道0-62。
4.通过输入“back/BACK”模拟使用遥控器的返回按钮,使之返回上一个频道。
5.通过输入“off/OFF”模拟使用遥控器的关机按钮,使之关机。
6.通过输入数字模拟使用遥控器切换数字对应的频道。
功能实现思路:
在原来命令模式的框架下增加多一个ChannelChange类,该类的构造方法中初始化从键盘输入的字符串和读取现在的频道号;该类包含ChannelChangestart方法,可根据键盘输入的字符串判定频道切换的方式;同时,控制电视开关机方式一并包含在ChannelChange类中。在主类添加一个while循环控制电视机在不关闭的情况下可以变更频道。
功能实现难点:
如何设计遥控器返回按钮?我在实现这两个功能时想了好久(刚入门的小白编程能力差),(大佬觉得简单可以直接跳过此处),后来通过一个定义temp[]数组用于存放上一个频道和现在频道解决了问题。
(源代码在文章末尾)
代码运行测试:
1.通过输入“+”模拟使用遥控器往上增加频道。
2.输入“-”模拟往下调低频道。
3.限定频道0-62。
4.通过输入“back/BACK”模拟使用遥控器的返回按钮,使之返回上一个频道。
5.通过输入“off/OFF”模拟使用遥控器的关机按钮,使之关机。
6.通过输入数字模拟使用遥控器切换数字对应的频道。
总结:首先,想要对原程序进行功能修改,必须非常熟悉源代码,了解其中有几个类,类与类之间的关系,最好能画出UML图(这次我没有画,因为我不太熟悉)。重构这个程序花了我比较多时间,一是我编程能力比较差,编程基础不扎实,有待提高。二是对命令模式半知半解,所以说,提高自己的编程能力很重要。
源代码附上:
//ChannelChange.java public class ChannelChange { CommandChange commandchange; String inputsign; //输入的字符 int channelnum; //现在的频道 Tv myTv = new Tv();// 命令接收者 CommandOn on = new CommandOn(myTv);// 开机命令 CommandOff off = new CommandOff(myTv); // 关机命令 public ChannelChange(String inputsign,int channelnum) { //构造函数 this.inputsign =inputsign; this.channelnum=channelnum; } CommandChange channel = new CommandChange(myTv, channelnum);// 频道切换命令 public void ChannelChangestart( int []temp) { //频道切换方法,temp[]数组存放上一个频道和现在频道 if(inputsign.equals("+")) { //频道往上加 if(channelnum>=62) channelnum=0; temp[0]=channelnum; //temp[0]记录上一个频道 channelnum=channelnum+1; //频道增加 } else if(inputsign.equals("-")) { //频道往下减 if(channelnum<=0) { channelnum=62; } temp[0]=channelnum; channelnum=channelnum-1; } else if(inputsign.equals("back") || inputsign.equals("BACK")) { //返回上一个频道 channelnum=temp[0]; } else if(inputsign.equals("off") || inputsign.equals("OFF")) //关闭电视 System.out.println("It's going to turn off."); else { channelnum = Integer.parseInt(inputsign); //转换字符串的数字为int类型 if(channelnum>62 || channelnum<0) { //限定频道0-62 System.out.println("没有这个频道,为您跳转第一个频道"); channelnum=0; } temp[0]=temp[1]; //保证temp[0]始终存放前一个频道,temp[0]存放现在频道 temp[1]=channelnum; } temp[1]=channelnum; CommandChange channel = new CommandChange(myTv,channelnum ); // 频道切换命令 Control control = new Control(on, off, channel); // 命令控制对象 if(inputsign.equals("off") || inputsign.equals("OFF")) control.turnOff();// 关机 else control.changeChannel(); } } //Command.java public interface Command { void execute(); } //CommandChange.java //频道切换命令 public class CommandChange implements Command { private Tv myTv; public int channel; public CommandChange(Tv tv, int channel) { myTv = tv; this.channel = channel; } public void execute() { myTv.changeChannel(channel); } } //CommandOff.java //关机命令 public class CommandOff implements Command { private Tv myTv; public CommandOff(Tv tv) { myTv = tv; } public void execute() { myTv.turnOff(); } } //CommandOn.java //开机命令 public class CommandOn implements Command { private Tv myTv; public CommandOn(Tv tv) { myTv = tv ; } public void execute() { myTv.turnOn(); } } //Control.java //可以看作是遥控器吧 public class Control { private Command onCommand, offCommand, changeChannel; public Control(Command on, Command off, Command channel) { this.onCommand = on; this.offCommand = off; this.changeChannel = channel; } public void turnOn() { onCommand.execute(); } public void turnOff() { offCommand.execute(); } public void changeChannel() { changeChannel.execute(); } } //Tv.java public class Tv { public int currentChannel = 0; public void turnOn(){ System.out.println("The television is on."); } public void turnOff() { System.out.println("The television is off."); } public void changeChannel(int channel) { this.currentChannel = channel; System.out.println("Now TV channel is " + channel); } } //Client.java import java.util.Scanner; public class Client { public static void main(String[] args) { int channelnum=2; int backchannel=2; int []temp=new int[2]; temp[0]=temp[1]=2; // 命令接收者 Tv myTv = new Tv(); // 开机命令 CommandOn on = new CommandOn(myTv); // 关机命令 CommandOff off = new CommandOff(myTv); // 频道切换命令 CommandChange channel = new CommandChange(myTv, channelnum); // 命令控制对象 Control control = new Control(on, off, channel); // 开机 control.turnOn(); // 切换频道 control.changeChannel(); System.out.println("选择自己喜欢的频道号,回车键确认;或者输入“+”或“-”并回车切换到到下一个频道;输入“back/BACK”返回到上一个频道;关闭电视机请输入“off/OFF"); while(true) { Scanner sc=new Scanner(System.in); String inputsign=null; inputsign=sc.nextLine(); ChannelChange channelchange=new ChannelChange(inputsign,channelnum); channelchange.ChannelChangestart(temp); channelnum=channelchange.channelnum; } } }
转载请注明出处!