作业5(单一职责&开放闭合)
1,简述单一职责原则的优点,并举例说明什么是单一职责原则?
单一职责原则是面向对象设计中的一个重要原则,也被称为SRP原则。它的核心思想是一个模块/类/函数只负责一项职责,即一个模块/类/函数只有一个引起它变化的原因。这样可以使代码更加高内聚、低耦合,易于维护和扩展,并且可以提高代码的可读性和可维护性。
举一个简单的例子:一个计算器类应该只有计算的功能,而不应该包括界面展示的功能。如果将界面展示的功能也加入到计算器类中,那么当界面展示需要变化时,就不得不修改计算器类的代码,违反了单一职责原则。
另一个例子是一个日志类,它只应该负责记录日志,而不应该同时负责发送邮件或者短信通知。如果将发送邮件或短信的功能也加入到日志类中,那么当发送方式需要变化时,就不得不修改日志类的代码,也违反了单一职责原则。
总之,单一职责原则是面向对象设计中的一个重要原则,它可以使代码更加高内聚、低耦合、易于维护和扩展,并且可以提高代码的可读性和可维护性。
2,Sunny软件公司开发的CRM系统可以显示各种类型的图表,如饼状图、柱状图等。该系统持续改进,用户希望能够支持更多类的图表显示方式,例如增加LineChart,利用开放闭合原则优化如下类的设计。
可以采取以下设计方案:
-
定义一个抽象的图表类 Chart,其中包含一个抽象的 display() 方法用于显示图表。
-
Chart 类的子类分别表示不同类型的图表,例如 PieChart、BarChart、LineChart 等,它们实现了父类 Chart 的 display() 方法。
-
如果要增加新类型的图表,只需要定义一个新的子类,并实现 display() 方法即可,不需要修改现有的代码。
这样,当用户需要新的图表类型时,只需增加相应的子类,而不是修改已有的代码,符合开放-封闭原则,也提高了系统的可维护性和扩展性。
3,简述开放闭合原则的核心,并举例说明如何使用开放闭合原则优化类的设计。
开放闭合原则是面向对象设计中重要的设计原则之一,其核心思想是对扩展开放,对修改关闭。这意味着一个类的设计应该可以方便地扩展功能,而不需要修改原有的代码。
一个常见的例子就是计算器程序。假设我们有一个计算器程序,其中包含加减乘除四个操作。现在,我们需要新增一个求平方的操作。如果我们不遵循开放闭合原则,很可能需要修改原有代码,甚至在每个操作中都要添加一个平方操作。这会导致代码维护的困难,也会增加出错的风险。
优化类的设计可以遵循开放闭合原则,可以采用策略模式或者工厂模式来实现。我们可以为每个操作定义一个接口,然后通过实现类来具体实现每个操作。这样,当我们需要新增一个操作时,只需要实现新的操作接口即可,不需要修改原有代码。同时,也可以通过工厂模式来动态实例化具体的操作类,进一步实现开放闭合原则。这样做的好处是,当我们需要添加新的操作时,只需要新增操作类并实现操作接口即可,不需要修改原有的代码。
4,某基于Java的C/S系统的登录功能通过如下类实现,请分析类的组成,并利用单一职责原则对其重构
由于没有给出具体的登录功能实现代码,无法直接分析类的组成。但是,根据常规的C/S系统设计,登录功能通常涉及到前端界面(如登录界面)和服务器端的处理(如验证用户账号密码),因此可以初步将其分为两部分:前端和后端。
前端部分可以抽象出一个LoginView类,主要包含登录界面的UI设计和用户输入的信息获取。该类负责展示并获取用户输入的信息,但不应该处理输入信息的验证和登录操作。
后端部分可以抽象出一个LoginService类,负责处理用户登录请求。该类应该包括对用户输入信息的验证和登录状态的确认,并将登录状态返回给前端。但不应该涉及UI界面和用户输入信息的处理。
根据单一职责原则,一个类应该只有一个职责,不能承担过多的职责。因此,建议将前端的UI设计和用户输入信息的获取分离出来,由LoginView类负责;将用户登录请求的处理分离出来,由LoginService类负责。这样可以提高代码的可维护性和可读性,同时也有利于代码的单元测试。
5,利用Java代码实现单一职责原则课堂Book案例。
public class Book {
private String name;
private String author;
private String publisher;
private int pageCount;
private double price;
public Book(String name, String author, String publisher, int pageCount, double price) {
this.name = name;
this.author = author;
this.publisher = publisher;
this.pageCount = pageCount;
this.price = price;
}
public String getName() {
return name;
}
public String getAuthor() {
return author;
}
public String getPublisher() {
return publisher;
}
public int getPageCount() {
return pageCount;
}
public double getPrice() {
return price;
}
}
public interface BookPersistence {
void save(Book book, String filename);
}
public class FileBookPersistence implements BookPersistence {
@Override
public void save(Book book, String filename) {
// 将Book对象保存在文件中
}
}
public class DatabaseBookPersistence implements BookPersistence {
@Override
public void save(Book book, String filename) {
// 将Book对象保存在数据库中
}
}
public interface BookPrinter {
void print(Book book);
}
public class ConsoleBookPrinter implements BookPrinter {
@Override
public void print(Book book) {
// 在控制台上打印Book对象的信息
}
}
public class WebBookPrinter implements BookPrinter {
@Override
public void print(Book book) {
// 在web页面上打印Book对象的信息
}
}
在上述代码中,Book类表示一本书,它只包含一本书的基本信息,例如书名、作者、出版商、页数和价格。这遵循了单一职责原则,即每个类应该只有一个职责。BookPersistence和BookPrinter接口分别表示将书籍信息保存到不同介质,以及将书籍信息打印到不同设备上。FileBookPersistence和DatabaseBookPersistence类分别表示将书籍信息保存到文件和数据库中。ConsoleBookPrinter和WebBookPrinter类分别表示将Book对象打印到控制台和Web页面上。这些类的分离允许它们