设计模式七大原则附C++正反例源码
设计模式的七大原则是软件设计的基石,它们指导开发者构建高内聚、低耦合、易维护、可扩展的系统。以下以C++为例,详细介绍这七大原则:
一、单一职责原则(Single Responsibility Principle, SRP)
定义:一个类应该只有一个引起它变化的原因(即一个类只负责一项职责)。
目的:降低类的复杂度,提高代码复用性和可维护性。
反例(违反SRP):
一个类同时负责"用户数据管理"和"用户数据展示",当展示方式变化时,可能影响数据管理逻辑。
#include <string>
using namespace std;// 违反SRP:同时负责数据管理和UI展示
class User {
private:string name;
public:User(string n) : name(n) {}// 数据管理职责void save() { /* 保存用户到数据库 */ }// UI展示职责void display() { /* 在控制台打印用户信息 */ }
};
正例(遵循SRP):
拆分职责为两个类,各自负责单一功能:
#include <string>
using namespace std;// 仅负责数据管理
class UserManager {
private:string name;
public:UserManager(string n) : name(n) {}void save() { /* 保存用户到数据库 */ }
};// 仅负责UI展示
class UserDisplay {
private:string name;
public:UserDisplay(string n) : name(n) {}void show() { /* 在控制台打印用户信息 */ }
};
二、开放封闭原则(Open-Closed Principle, OCP)
定义:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
目的:在不修改现有代码的前提下,通过扩展实现新功能,减少风险。
反例(违反OCP):
添加新形状时,需要修改现有计算面积的函数:
#include <iostream>
using namespace std;enum ShapeType { CIRCLE, RECTANGLE };class Shape {
public:ShapeType type;// 违反OCP:添加新形状需修改此函数double calculateArea() {if (type == CIRCLE) {// 圆形面积计算} else if (type == RECTANGLE) {// 矩形面积计算}return 0;}
};
正例(遵循OCP):
通过抽象基类和继承扩展新功能,无需修改原有代码:
#include <iostream>
using namespace std;// 抽象基类(对修改关闭)
class Shape {
public:virtual double calculateArea() = 0; // 纯虚函数
};// 圆形(扩展开放)
class Circle : public Shape {
private:double radius;
public:Circle(double r) : radius(r) {}double calculateArea() override {return 3.14 * radius * radius;}
};// 新增矩形无需修改原有代码(扩展开放)
class Rectangle : public Shape {
private:double width, height;
public:Rectangle(double w, double h) : width(