软件工程作业 第一周

关键词:命令模式

 (完整代码在文章末尾)

作业要求:看别人写的小程序,了解该程序怎么运行,并对该程序进行重构。第二周周四之前提交到老师邮箱。

  这次作业选择了网上的一个小程序  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;
     }
     }
}
View Code

 转载请注明出处!

原文地址:https://www.cnblogs.com/jiangfenli/p/Fighting.html