做网站用的什么语言,中国十大咨询管理公司,网页设计与制作大赛,广州天河建站公司1.真题内容
在某系统中#xff0c;类 Interval(间隔) 代表由下界(lower bound(边界))上界(upper bound )定义的区间。 要求采用不同的格式显示区间范围。 如#xff3b;lower bound , upper bound ]、[ lower bound … upper bound ]、[ lower bou nd - upper bound #x…1.真题内容
在某系统中类 Interval(间隔) 代表由下界(lower bound(边界))上界(upper bound )定义的区间。 要求采用不同的格式显示区间范围。 如lower bound , upper bound ]、[ lower bound … upper bound ]、[ lower bou nd - upper bound 等。 现采用策略(strategy)模式实现该要求得到如图5-1所示的类图。 2.策略模式(strategy) 191页
策略模式(strategy)定义一系列算法把它们一个个封装起来并且使它们之间可以互相替换从而让算法可以独立于使用它的用户而编号。
3.类图关系 167页 4.真题代码
import java.util.*;
enum TYPE { COMMA, DOTS, LINE };
interface PrintStrategy{ public (1) ;
}class Interval {private double lowerBound; private double upperBound; public Interval(double p_lower, double p_upper){lowerBound p_lower; upperBound p_upper;}public void printInterval(PrintStrategy ptr) {(2);} public double getLower() { return lowerBound; }public double getUpper() { return upperBound; }
}class PrintIntervalsComma implements PrintStrategy{ public void doPrint(Interval val){System.out.println([ val.getLower() , val.getUpper()]);}
}
class PrintIntervalsDots implements PrintStrategy {public void doPrint(Interval val) {System.out.println([ val.getLower() ... val.getUpper() ]); }
}
class PrintIntervalsLine implements PrintStrategy {public void doPrint(Interval val) {System.out.println([ val.getLower() - val.getUpper() ]);}
}class Strategy {
public static PrintStrategy getStrategy(TYPE type) {PrintStrategy st null;switch (type) {case COMMA: (3) break;case DOTS:(4)break;case LINE:(5)break;}return st;}
}public static void main(String[] args) {Interval a new Interval(1.7, 2.1);a.printInterval(getStrategy(TYPE.COMMA));a.printInterval(getStrategy(TYPE.DOTS));a.printInterval(getStrategy(TYPE.LINE)); }
}5.题目解析
由图可知PrintStrategy打印策略父类它有3个子类。 分别为PrintIntervalsComma打印间隔逗号、PrintIntervalsDots打印间隔点、PrintIntervalsLine打印间隔线。
通过实心的菱形箭头判断Interval(间隔)和PrintStrategy(打印策略)有一个1对多的关系。 推测Interval(整体)里可能会有PrintStrategy(部分)。
观察代码 enum TYPE { COMMA, DOTS, LINE }定义了一个枚举枚举通常是常量。
PrintStrategy父接口缺失一个方法。 父接口中缺失的方法去它的子类中寻找。 在Comma中找到public void doPrint(Interval val)方法。 3个子类都有这个方法。 因此(1)void doPrint(Interval val)
Interval类中有一个public void printInterval方法该方法传入了一个PrintStrategy对象ptr。 那第2空就是要调ptr做事情ptr是PrintStrategy的对象PrintStrategy只有一个方法doPrint。 doPrint方法需要传入Interval参数现在就在Interval中因此用this。 (2)ptr.doPrint(this)
用父接口PrintStrategy定义了一个变量st。 父接口定义的变量肯定是要去接子对象的。 这里是null表示一会肯定有一个意义的参数要传进来。 如果type传进来的是COMMA则把COMMA这个儿子传给父接口st。
6.代码解析
import java.util.*;
# import 是关键字用于导入包或类。
# java.util 是包的名称表示我们要导入的是 java.util包。
# * 是一个通配符表示导入该包中的所有类。enum TYPE { COMMA, DOTS, LINE };
# enum枚举是一种特殊的类用于表示一组固定的常量值
# 三个枚举常量COMMA逗号、DOTS点、LINE线interface PrintStrategy{
# interface: 关键字用于定义一个接口。
# PrintStrategyt打印策略: 接口名。 public void doPrint(Interval val); // (1) 添加方法声明 答案在实现接口中找 # 父接口PrintStrategy中缺失的方法去它的子类中寻找。# 去class PrintIntervalsComma implements PrintStrateg找方法# 子类中只有public void doPrint(Interval val)1个方法# 因此(1)void doPrint(Interval val)# public: 这是一个访问修饰符表示这个方法可以被任何其他类访问。# 因为interface里面的方法默认是public abstract的因此这里public也可以省略 # void返回类型为表示不返回任何值。# Interval参数类型# val参数名# 该方法接受一个名为 val单位的Interval间隔类型的参数
}class Interval {
# Interval:类名 private double lowerBound; private double upperBound; # 声明了一个名为 lowerBound 的私有成员变量。 # private访问修饰符表示这个变量只能在它所在的类内部访问。# 当一个类成员被声明为private时外部类和对象无法直接访问或修改这个变量。# double是一种基本数据类型用于表示双精度浮点数。# lowerBound(下边界) upperBound上边界 是私有实例变量。# lowerBound下界 upperBound上界public Interval(double p_lower, double p_upper){lowerBound p_lower; upperBound p_upper;}# 定义了一个构造函数用于初始化 Interval 类的实例。# 构造函数语法示例第一行class Person 第二行 public Person(String name) {this.name name;}# 构造函数是一种特殊的方法它的名字与类名相同并且没有返回类型。# 这个构造函数允许在创建 Interval 类的实例时通过参数直接设置 lowerBound 和 upperBound 的初始值。# 这个构造函数接收两个双精度浮点数 p_lower 和 p_upper然后将它们分别赋值给类的成员变量 lowerBound 和 upperBound# Interval构造函数# double p_lower, double p_upper参数列表# lowerBound、upperBound类的实例变量# p_lower、p_upper传入的参数public void printInterval(PrintStrategy ptr){ptr.doPrint(this);} // (2) 调用doPrint方法并传递当前对象# 定义一个名为 printInterval的方法该方法接受一个PrintStrategy类型的参数ptr。# 调用该参数的 doPrint 方法将当前对象即 this作为参数传递给 doPrint 方法。# printInterval方法传入了一个ptr对象后面通常就要去调ptr的方法。# 去PrintStrategy中寻找它只有一个方法doPrint。# doPrint需要传入Interval类型的参数。 # this 关键字引用的是当前对象因为代码就在Interval类里。# 注意Interval val是定义的时候设置的形参实际调用的时候用具体的数据传进去。# 当doPrint方法需要访问当前 Interval 对象的数据可以使用this。# printInterval方法名# PrintStrategy参数类型# ptr对象名# doPrint方法名public double getLower() { return lowerBound; }public double getUpper() { return upperBound; }# public:表示该方法可以被任何其他类访问# double:这方法的返回类型表示该方法将返回一个双精度浮点数double# getLower:方法的名。根据命名约定方法名通常以小写字母开头并使用驼峰命名法camelCase# 在这个例子中getLower 暗示了这个方法的作用是获取某个值的下限lower bound# ():圆括号内可以包含参数列表。圆括号是空的表示这个方法不接受任何参数# 花括号 {} 包围的方法体包含了方法的具体实现# return lowerBound; 是方法体中的一条语句表示返回一个名为 lowerBound 的变量的值。# 这个变量应该是在类的其他地方定义的一个成员变量
}class PrintIntervalsComma implements PrintStrategy{
# 具体的实现类
# PrintIntervalsComma:类的名称。
# implements:表示一个类实现了某个接口。接口定义了一组方法这些方法必须在实现该接口的类中被实现。
# PrintStrategy:这是接口的名称。接口是一种抽象类型定义了一组方法但不提供其具体实现。public void doPrint(Interval val){System.out.println([ val.getLower() , val.getUpper()]);}
}
# doPrint:方法名。在这个例子中doPrint 暗示这个方法的作用是执行打印操作。
# Interval参数类型。
# val参数名。
# doPrint方法接受一个名为 val 的参数其类型是 Interval。# System.out.println 是一个标准输出方法用于将文本输出到控制台。
# [ val.getLower() , val.getUpper()] 是拼接字符串表示要输出的内容。
# val.getLower() 调用 val 对象的 getLower 方法获取区间的下界。class PrintIntervalsDots implements PrintStrategy {public void doPrint(Interval val) {System.out.println([ val.getLower() ... val.getUpper() ]); }
}
class PrintIntervalsLine implements PrintStrategy {public void doPrint(Interval val) {System.out.println([ val.getLower() - val.getUpper() ]);}
}class Strategy {public static PrintStrategy getStrategy(TYPE type) {# getStrategy方法接受一个TYPE枚举值作为参数并根据这个值返回相应的PrintStrategy实现类。# static:关键字表示该方法属于类本身而不是类的实例。静态方法可以直接通过类名调用而不需要创建类的实例。# 如果PrintStrategy是一个工具类你可以直接使用PrintStrategy getStrategy(type)来获取策略。# 而不需要先创建一个PrintStrategy对象。# PrintStrategy:这是方法的返回类型表示该方法将返回一个 PrintStrategy类型的对象。# getStrategy:方法名。在这个例子中getStrategy 表示这个方法的作用是根据传入的类型获取相应的打印策略。# TYPE参数类型# type参数名PrintStrategy st null;# 声明并初始化一个名为 st 的变量。# PrintStrategy类型声明。# PrintStrategy 是一个类或接口的名称它表示变量 st 的类型。# 在 Java 中类型可以是基本数据类型如 int, double也可以是用户定义的类或接口。# st 是变量的名称# null 是变量 st 的初始值。null 是一个特殊的字面量表示对象引用不指向任何对象。switch (type) {# switch 控制流语句根据变量的值执行不同的代码块。# 在这里它基于 type 的值选择不同的分支。case COMMA: # case 关键字用于定义 switch 语句的一个分支。# 如果 type 的值是 COMMA则执行该分支内的代码。st new PrintIntervalsComma(); // (3) 实例化正确的类#如果 type 的值是 COMMA则实例化一个 PrintIntervalsComma 对象并将其赋值给 st 变量。# st是PrintStrategy类型的# PrintIntervalsComma是一个实现了 PrintStrategy接口的类# 推测3是要创建一个具体的实例化对象break;# break 语句用于终止当前的 case 分支防止继续执行后续的 case 分支。 case DOTS:st new PrintIntervalsDots(); // (4) 实例化正确的类break;case LINE:st new PrintIntervalsLine(); // (5) 实例化正确的类break;}return st;}
}public static void main(String[] args) {
# 程序入口点Interval a new Interval(1.7, 2.1);# 声明一个名为a的变量其类型为 Interval。# 使用 new 关键字调用Interval类的构造函数并传递两个参数 1.7和2.1。# 将创建的 Interval对象赋值给变量a。 a.printInterval(getStrategy(TYPE.COMMA));a.printInterval(getStrategy(TYPE.DOTS));a.printInterval(getStrategy(TYPE.LINE)); # 调用 a 对象的 printInterval 方法。# 将 getStrategy(TYPE.LINE) 的返回值作为参数传递给 printInterval 方法。# a变量名# printInterval方法名用于打印区间信息。# getStrategy(TYPE.LINE)方法调用调用 getStrategy方法并传递 TYPE.LINE 作为参数。# 这个方法返回一个实现了某个策略接口或抽象类的实例。# TYPE.LINE 枚举常量}
}