目录
2. 根据以下描述绘制类图,再正向工程生成Java源代码(也可生成其他面向对象语言的源代码,如C++或C#等):
1. 绘制以下类图并生成源代码(语言不限)
(1)
(2)
(3)
2. 根据以下描述绘制类图,再正向工程生成Java源代码(也可生成其他面向对象语言的源代码,如C++或C#等):
图形(Shape)可分为圆形(Circle)、矩形(Rectangle)、椭圆形(Ellipse)等具体图形,在Shape类中提供了一个抽象的draw()方法用于绘制图形,而在具体的图形类中实现该抽象draw()方法。
提供一个图形工厂类(ShapeFactory),该类提供一个静态方法createShape(char type),其返回类型为Shape,参数type为所需绘制图形对应的代码,例如“c”表示圆形,“r”表示矩形,“e”表示椭圆形等,在createShape()方法中,可以使用条件语句来判断所需绘制图形的类型,并根据参数的不同返回不同的具体形状对象。【注:“创建关系”是一种特殊的“依赖关系”】
// Shape.java
public abstract class Shape {
public abstract void draw();
}
// Circle.java
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("Drawing Circle");
}
}
// Rectangle.java
public class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("Drawing Rectangle");
}
}
// Ellipse.java
public class Ellipse extends Shape {
@Override
public void draw() {
System.out.println("Drawing Ellipse");
}
}
// ShapeFactory.java
public class ShapeFactory {
public static Shape createShape(char type) {
if (type == 'c') {
return new Circle();
} else if (type == 'r') {
return new Rectangle();
} else if (type == 'e') {
return new Ellipse();
} else {
throw new IllegalArgumentException("Invalid shape type");
}
}
}
// Main.java (example usage)
public class Main {
public static void main(String[] args) {
Shape circle = ShapeFactory.createShape('c');
Shape rectangle = ShapeFactory.createShape('r');
Shape ellipse = ShapeFactory.createShape('e');
circle.draw(); // Drawing Circle
rectangle.draw(); // Drawing Rectangle
ellipse.draw(); // Drawing Ellipse
}
}
3. 根据以下描述绘制类图:
某商场会员管理系统包含一个会员类(Member),会员的基本信息包括会员编号、会员姓名、联系电话、电子邮箱、地址等,会员可分为金卡会员(GoldMember)和银卡会员(SilverMember)两种,不同类型的会员在购物时可以享受不同的折扣;每个会员可以拥有一个或多个订单(Order),每一个订单又可以包含至少一条商品销售信息(ProductItem),商品销售信息包括订单编号、商品编号、商品数量、商品单价和折扣等;每一条商品销售信息对应一类商品(Product),商品信息包括商品编号、商品名称、商品单价、商品库存量、商品产地等。
4. 在某公司财务系统的初始设计方案中存在如图1所示Employee类,该类包含员工编号(ID)、姓名(name)、年龄(age)、性别(gender)、薪水(salary)、每月工作时数(workHoursPerMonth)、每月请假天数(leaveDaysPerMonth)等属性。该公司的员工包括全职和兼职两类,其中每月工作时数(workHoursPerMonth)用于存储兼职员工每个月工作的小时数,每月请假天数(leaveDaysPerMonth)用于存储全职员工每个月请假的天数。系统中两类员工计算工资的方法也不一样,全职员工按照工作日数计算工资,兼职员工按照工作时数计算工资,因此在Employee类中提供了两个方法calculateSalaryByDays()和calculateSalaryByHours()分别用于按照天数和时数计算工资,此外,还提供了方法displaySalary()用于显示工资。
图1 Employee类初始类图
试采用所学面向对象设计原则分析图1中Employee类存在的问题并对其进行重构,绘制重构之后的类图。
答: 分析该类,存在的问题:
- 违反了单一职责原则。Employee类负责存储员工信息、计算工资,并显示工资,这违反了单一职责原则,应该将这些不同的责任分离出去,以便每个类有一个清晰的职责。
- 违反了开闭原则。如果公司新增了其他类型的员工(例如实习生),需要修改Employee类,这违反了开闭原则,应该设计以支持扩展而不需要修改现有代码的方式。
- 违反了里氏代换原则。子类(例如全职和兼职员工)应该能够替换其父类(Employee)而不导致系统错误,在这里,全职和兼职员工具有不同的属性和方法,可能会违反里氏代换原则。
重构后的图: