zoukankan      html  css  js  c++  java
  • 软件工程作业 第一周

    关键词:命令模式

     (完整代码在文章末尾)

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

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

     转载请注明出处!

  • 相关阅读:
    ios 应用程序之间的跳转(内置程序的实现)
    iOS手势UIGustureRecognizer
    动画学习之Animating Views with Blocks
    get 和post 方式请求数据
    通过路径添加图片
    contentSize、contentInset和contentOffset区别
    bzoj1055 [HAOI2008]玩具取名 区间DP
    bzoj1025 [SCOI2009]游戏 动态规划
    POJ2299 树状数组求逆序对
    洛谷1525 关押罪犯NOIP2010 并查集
  • 原文地址:https://www.cnblogs.com/jiangfenli/p/Fighting.html
Copyright © 2011-2022 走看看