在软件开发中,设计模式是一种用于解决常见问题的重复性方案。它们不仅提供了一种结构化的方法来解决问题,而且还能改善代码的可读性和可维护性。设计模式遵循一些基本原则,这些原则是指导设计模式实施的准则。本文将介绍设计模式遵循的大原则,并提供相应的源代码示例。
一、单一职责原则(Single Responsibility Principle)
单一职责原则要求一个类或模块只负责一项功能。这意味着一个类应该只有一个引起它变化的原因。当一个类承担了过多的职责时,它的可维护性和可扩展性将变得很差。遵循单一职责原则可以使代码更加清晰、可读性更高。
示例代码:
class Order {
public void calculateTotalPrice() {
// 计算订单总价
}
public void generateInvoice() {
// 生成发票
}
public void sendNotification() {
// 发送通知
}
}
根据单一职责原则,上述代码可以进行重构,将不同的职责分离成不同的类:
class Order {
public void calculateTotalPrice() {
// 计算订单总价
}
}
class InvoiceGenerator {
public void generateInvoice() {
// 生成发票
}
}
class NotificationSender {
public void sendNotification() {
// 发送通知
}
}
二、开放-封闭原则(Open-Closed Principle)
开放-封闭原则要求软件实体(类、模块、函数等)对扩展开放,对修改封闭。这意味着在增加新功能时,应该尽量通过扩展现有代码来实现,而不是修改已有的代码。这样可以避免对现有功能的影响,提高代码的稳定性和可维护性。
示例代码:
class Shape {
public void draw() {
// 绘制形状
}
}
class Circle extends Shape {
@Override
public void draw() {
// 绘制圆形
}
}
class Rectangle extends Shape {
@Override
public void draw() {
// 绘制矩形
}
}
根据开放-封闭原则,当需要增加新的形状时,不需要修改现有代码,只需要创建新的类并继承自Shape类:
class Triangle extends Shape {
@Override
public void draw() {
// 绘制三角形
}
}
三、里氏替换原则(Liskov Substitution Principle)
里氏替换原则要求程序中的对象应该可以被它们的子类所替代,而不会影响程序的正确性。换句话说,子类应该能够替代父类并且表现出相同的行为。遵循里氏替换原则可以提高代码的可扩展性和灵活性。
示例代码:
class Rectangle {
protected int width;
protected int height;
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public int getArea() {
return width * height;
}
}
class Square extends Rectangle {
@Override
public void setWidth(int width) {
super.setWidth(width);
super.setHeight(width);
}
@Override
public void setHeight(int height) {
super.setWidth(height);
super.setHeight(height);
}
}
根据里氏替换原则,上述代码违反了原则。因为正方形的宽高应该相等,但是通过设置宽度【设计模式的核心原则:提高代码的可重用性和可维护性】
设计模式的核心原则是为了提高代码的可重用性和可维护性。设计模式是一种解决常见问题的重复方案,它们提供了一种结构化的方法来解决问题,并改善代码的可读性和可维护性。以下是设计模式遵循的主要原则,以及相应的源代码示例。
一、单一职责原则(Single Responsibility Principle)
单一职责原则要求一个类或模块只负责一项功能。这意味着一个类应该只有一个引起它变化的原因。当一个类负责过多的职责时,它的可维护性和可扩展性将变得很差。遵循单一职责原则可以使代码更清晰、可读性更高。
示例代码:
class Order {
public void calculateTotalPrice() {
// 计算订单总价
}
public void generateInvoice() {
// 生成发票
}
public void sendNotification() {
// 发送通知
}
}
根据单一职责原则,上述代码可以进行重构,将不同的职责分离成不同的类:
class Order {
public void calculateTotalPrice() {
// 计算订单总价
}
}
class InvoiceGenerator {
public void generateInvoice() {
// 生成发票
}
}
class NotificationSender {
public void sendNotification() {
// 发送通知
}
}
二、开放-封闭原则(Open-Closed Principle)
开放-封闭原则要求软件实体对扩展开放,对修改封闭。这意味着在增加新功能时,应该尽量通过扩展现有代码来实现,而不是修改已有的代码。这样可以避免对现有功能的影响,提高代码的稳定性和可维护性。
示例代码:
class Shape {
public void draw() {
// 绘制形状
}
}
class Circle extends Shape {
@Override
public void draw() {
// 绘制圆形
}
}
class Rectangle extends Shape {
@Override
public void draw() {
// 绘制矩形
}
}
根据开放-封闭原则,当需要增加新的形状时,不需要修改现有代码,只需要创建新的类并继承自Shape类:
class Triangle extends Shape {
@Override
public void draw() {
// 绘制三角形
}
}
三、里氏替换原则(Liskov Substitution Principle)
里氏替换原则要求程序中的对象应该可以被它们的子类替代,而不会影响程序的正确性。换句话说,子类应该能够替代父类并且表现出相同的行为。遵循里氏替换原则可以提高代码的可扩展性和灵活性。
示例代码:
class Shape {
protected int width;
protected int height;
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public int getArea() {
return width * height;
}
}
class Rectangle extends Shape {
//...
}
class Square extends Shape {
@Override
public void setWidth(int width) {
super.setWidth(width);
super.setHeight(width);
}
@Override
public void setHeight(int height) {
super.setWidth(height);
super.setHeight(height);
}
}
根据里氏替换原则,上述代码违反了原则。因为正方形的宽高应该相等,但是通过设置宽度和高度分别来实现,破坏了父类和子类之间的行为一致