下面逐一介绍一下开发中常用设计模式需要遵循的六大原则。
一、单一职责原则
一个类应该只有一个引起变化的原因。这意味着一个类应该只负责一个功能
或只有一个引起它变化的原因
。
//违反单一职责原则
class Report {
public void generateReport() {
// 生成报告
}
public void saveReportToFile() {
// 将报告保存到文件
}
}
二、开闭原则
软件实体(类、模块、函数等)应该对扩展开放,对修改关闭
。即应通过扩展来实现功能的增加,而不是通过修改已有代码来实现。
// 遵循开闭原则
interface Shape {
void draw();
}
class Circle implements Shape {
@Override
public void draw() {
// 画圆形
}
}
class Square implements Shape {
@Override
public void draw() {
// 画正方形
}
}
三、里氏替换原则
子类应该能够替换其父类并出现在父类能够出现的任何地方
,而不引起任何错误。即子类对象可以替换父类对象,而程序功能不受影响。
// 遵循里氏替换原则
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) {
this.width = width;
this.height = width;
}
@Override
public void setHeight(int height) {
this.height = height;
this.width = height;
}
}
四、依赖倒置原则
高层模块不应该依赖于低层模块
,二者都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
// 遵循依赖倒置原则
interface MessageSender {
void sendMessage(String message);
}
class EmailSender implements MessageSender {
@Override
public void sendMessage(String message) {
// 发送邮件
}
}
class NotificationService {
private MessageSender messageSender;
public NotificationService(MessageSender messageSender) {
this.messageSender = messageSender;
}
public void sendNotification(String message) {
messageSender.sendMessage(message);
}
}
五、接口隔离原则
客户端不应该被迫依赖于它们不使用的接口。接口应该小而专门,而不是大而笨重。
// 遵循接口隔离原则
interface OnlineOrder {
void processOnlinePayment();
}
interface InStoreOrder {
void processInStorePayment();
}
class OnlineOrderProcessor implements OnlineOrder {
@Override
public void processOnlinePayment() {
// 处理在线支付
}
}
class InStoreOrderProcessor implements InStoreOrder {
@Override
public void processInStorePayment() {
// 处理线下支付
}
}
六、最少知道原则
一个对象应当对其他对象有尽可能少的了解,不要和陌生人说话,只与你的朋友谈话。也就是说,一个对象应当尽可能少地了解其他对象
,只与其直接朋友通信。
// 遵循最少知道原则
class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
public void start() {
engine.start();
}
}
class Engine {
public void start() {
// 发动引擎
}
}