开闭原则
开闭原则在大部分书籍中是这样描述的:
软件实体对扩展开放,对修改关闭
这句话有一些模糊不清,接下来我将用比较通俗的方式讲解它
“开”和“闭”的故事
接下来,我们用分类书为比喻,帮助你理解这一思想。
首先我们先来规定一下书的一些具有的属性,这里列出三种:大小、类别、颜色。
enum class BookColor {
RED,
GREEN,
BLUE,
};
enum class BookType {
SCIENCE,
HISTORY,
};
enum class BookSize {
SMALL,
MEDIUM,
LARGE,
};
class Book {
public:
BookColor color;
BookType type;
BookSize size;
std::string name;
std::string auther;
};
起初,我们的需求很简单——找到并筛选出所有的科学类书籍,所以你很轻松的写了一个筛选器
,用代码来看,可能是这样的:
class BookFilter {
using Books = std::vector<Book *>;
public:
Books by_type(const Books books, BookType type) {
Books result;
for (const auto &book : books) {
if (book->type == type) {
result.push_back(book);
}
}
return result;
}
};
我们设计了一个书类和一个书架类,书架中可以存放书的内容。
嗯,非常好,感觉筛选器的功能很好用,我们的需求就达到了。
现在,新的需求来了——找到并筛选出所有的红色封面书籍。或许你可能会继续上面的思路写:
class BookFilter {
using Books = std::vector<Book *>;
public:
Books by_type(const Books books, BookType type) {
Books result;
for (const auto &book : books) {
if (book->type == type) {
result.