已知年级由班级组成、班级由学生组成,在成绩发布之后每个学生会根据自身成绩的情况做出不同的响应,请基于组合(Composite)模式与访问者(Visitor)模式设计该程序。
主程序关键代码:
public class Main {
public static void main(String[] args) {
/*
* 输入代码,请保留
* 数组inputs对应控制台输入
* inputs[0]: 0 - 年级、班级、学生等数据在程序内由createObjectStructure方法创建;
* 1 - 年级、班级、学生等数据从控制台输入并经过parseInputs方法分析得到;
* inputs[1]: {g01:{c01:{s01-Jack-80,s02-Tom-70},c02:{s03-Green-90,s04-Smith-70}},g02:{c03:{s05-Jones-75,s06-Jerry-85}}}
* */
Scanner sc = new Scanner(System.in);
String[] inputs = new String[2];
for(int i=0;i<inputs.length;i++){
inputs[i]=sc.nextLine();
}
sc.close();
visitor = new ...(); //创建访问者
...[] grades=null;
// 根据输入情况来选择采用何种方式创建年级、班级、学生等对象,并将其组合。
if (Integer.parseInt(inputs[0])==0)
grades = createObjectStructure();
else
grades = parseInputs(inputs[1]);
....accept(visitor); //接受访问者对象,输出结果
...
}
/* 创建年级、班级、学生对象并将其组合起来 */
public static Grade[] createObjectStructure() {
/* 创建的年级、班级、学生对象如下:
年级:g01,该年级有以下班级:
班级:c101,该班级有以下学生
学生:s01,Jack,70
----s04,Green,50
--c102
----s02,Tom,80
----s05,Smith,60
g02
--c103
----s03,Jerry,90
----s06,Jones,70
*/
...
}
/* 通过分析strInput字符串创建年级、班级、学生对象并将其组合起来 */
public static Grade[] parseInputs(String strInput) {
...
}
}
输入格式:
第1行:创建对象的方式,0或1,含义参见主程序关键代码注释
第2行:年级、班级、学生数据,格式为
{年级1:{班级1:{学号1-姓名1-成绩1,...},...},...}
参见输入输出样例
输出格式:
年级
--班级(人数)
----学号1,姓名1,成绩1,passed
----学号2,姓名2,成绩2,failed
passed表示通过考试,即分数大于或等于60分
failed表示未通过考试,即分数小于60分
输入样例:
当第一行输入为0时,第二行可以输入任意内容,对结果无影响
0
123
当第一行输入为1时,第二行应按指定格式输入年级、班级、学生等实体内容
1
{g01:{c01:{s01-Jack-80,s02-Tom-70},c02:{s03-Green-90,s04-Smith-70}},g02:{c03:{s05-Jones-75,s06-Jerry-85}}}
输出样例:
当第一行输入为0时,输出内容确定,必定为以下内容:
g01
--c101(2)
----s01,Jack,70,passed
----s04,Green,50,failed
--c102(2)
----s02,Tom,80,passed
----s05,Smith,60,passed
g02
--c103(2)
----s03,Jerry,90,passed
----s06,Jones,70,passed
当第一行输入为1时,输出内容由第二行输入数据决定
g01
--c01(2)
----s01,Jack,80,passed
----s02,Tom,70,passed
--c02(2)
----s03,Green,90,passed
----s04,Smith,70,passed
g02
--c03(2)
----s05,Jones,75,passed
----s06,Jerry,85,passed