设计模式七大原则深度解析与应用实践
引言
设计模式是软件开发中的经典解决方案,而设计原则则是设计模式的基石。掌握这些原则,能够帮助我们编写出更灵活、可维护的代码。本文将详细讲解设计模式的七大原则,并通过丰富的代码示例和一个电商系统的应用场景,展示如何在实际开发中应用这些原则。
七大原则详解
1. 单一职责原则 (Single Responsibility Principle, SRP)
定义:一个类应该只有一个引起它变化的原因。 代码示例:
// 违反SRP的类
class User {
void login() { /* 登录逻辑 */ }
void sendEmail() { /* 发送邮件逻辑 */ }
}
// 符合SRP的类
class User {
void login() { /* 登录逻辑 */ }
}
class EmailService {
void sendEmail() { /* 发送邮件逻辑 */ }
}
应用场景:电商系统中,用户管理模块和邮件通知模块分离。
2. 开闭原则 (Open-Closed Principle, OCP)
定义:软件实体应对扩展开放,对修改关闭。 代码示例:
// 违反OCP的代码
class DiscountCalculator {
double calculate(String type) {
if (type.equals("VIP")) return 0.8;
else return 1.0;
}
}
// 符合OCP的代码
interface DiscountStrategy {
double applyDiscount();
}
class VIPDiscount implements DiscountStrategy {
@Override
public double applyDiscount() { return 0.8; }
}
class RegularDiscount implements DiscountStrategy {
@Override
public double applyDiscount() { return 1.0; }
}
应用场景:电商系统的折扣策略扩展。
3. 里氏替换原则 (Liskov Substitution Principle, LSP)
定义:子类必须能够替换父类,且不影响程序的正确性。 代码示例:
class Bird {
void fly() { /* 飞行逻辑 */ }
}
class Penguin extends Bird {
@Override
void fly() { throw new UnsupportedOperationException("企鹅不能飞!"); }
}
// 违反LSP,因为Penguin无法替换Bird
// 符合LSP的改进
class Bird {
void move() { /* 通用移动逻辑 */ }
}
class FlyingBird extends Bird {
void fly() { /* 飞行逻辑 */ }
}
class Penguin extends Bird {
void move() { /* 游泳逻辑 */ }
}
应用场景:电商系统中的支付方式扩展。
4. 接口隔离原则 (Interface Segregation Principle, ISP)
定义:客户端不应依赖它不需要的接口。 代码示例:
// 违反ISP的接口
interface Worker {
void work();
void eat();
}
// 符合ISP的接口
interface Workable {
void work();
}
interface Eatable {
void eat();
}
应用场景:电商系统中的员工角色划分。
5. 依赖倒置原则 (Dependency Inversion Principle, DIP)
定义:高层模块不应依赖低层模块,两者都应依赖抽象。 代码示例:
// 违反DIP的代码
class LightBulb {
void turnOn() { /* 开灯逻辑 */ }
}
class Switch {
private LightBulb bulb;
void operate() { bulb.turnOn(); }
}
// 符合DIP的代码
interface Switchable {
void turnOn();
}
class LightBulb implements Switchable {
@Override
public void turnOn() { /* 开灯逻辑 */ }
}
class Switch {
private Switchable device;
void operate() { device.turnOn(); }
}
应用场景:电商系统中的设备控制模块。
6. 迪米特法则 (Law of Demeter, LoD)
定义:一个对象应尽可能少地与其他对象交互。 代码示例:
// 违反LoD的代码
class Customer {
private Wallet wallet;
Wallet getWallet() { return wallet; }
}
class Wallet {
private double money;
double getMoney() { return money; }
}
// 调用时:customer.getWallet().getMoney();
// 符合LoD的代码
class Customer {
private Wallet wallet;
double getMoney() { return wallet.getMoney(); }
}
应用场景:电商系统中的用户钱包管理。
7. 合成复用原则 (Composite Reuse Principle, CRP)
定义:优先使用组合而非继承。 代码示例:
// 违反CRP的代码
class Car extends Engine { /* 继承方式 */ }
// 符合CRP的代码
class Car {
private Engine engine;
void start() { engine.start(); }
}
应用场景:电商系统中的订单与支付模块设计。
应用场景:电商系统设计
通过电商系统的模块划分(用户管理、支付、订单、折扣等),展示了如何在实际开发中应用七大原则。
总结
掌握设计模式的七大原则,能够帮助我们编写出高内聚、低耦合的代码,提升系统的可维护性和扩展性。