java软件设计模式实验(一):UML类图实验

目录

1. 绘制以下类图并生成源代码(语言不限)

2. 根据以下描述绘制类图,再正向工程生成Java源代码(也可生成其他面向对象语言的源代码,如C++或C#等):

3. 根据以下描述绘制类图:


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类存在的问题并对其进行重构,绘制重构之后的类图。

答: 分析该类,存在的问题:

  1.  违反了单一职责原则。Employee类负责存储员工信息、计算工资,并显示工资,这违反了单一职责原则,应该将这些不同的责任分离出去,以便每个类有一个清晰的职责。
  2.  违反了开闭原则。如果公司新增了其他类型的员工(例如实习生),需要修改Employee类,这违反了开闭原则,应该设计以支持扩展而不需要修改现有代码的方式。
  3. 违反了里氏代换原则。子类(例如全职和兼职员工)应该能够替换其父类(Employee)而不导致系统错误,在这里,全职和兼职员工具有不同的属性和方法,可能会违反里氏代换原则。

重构后的图:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值