接口描述了类的行为和功能,而不需要完成类的特定实现。
C++接口是使用抽象类来实现的,如果一个类中至少有一个函数为纯虚函数,则这个类就是抽象类。
下图所示:我们设计一个文件系统,FileInterface表示一个文件系统的抽象类(也就是接口)。这是一个典型的组合模式(Composite Pattern)实现,用于表示树形结构的文件系统。
核心类与设计思想
类名 | 角色 | 关键特性 |
FileInterface | 抽象基类(接口) | 定义文件系统的统一操作接口(print) |
File | 叶子节点(单个文件) | 仅实现print() |
Directory | 容器节点(目录) | 实现add()和print(),管理子项(vector<FileInterface*>),支持递归操作 |
FileInterface.h
#pragma once
#include <string>
#include <iostream>
// 定义一个文件接口类
class FileInterface
{
public:
FileInterface() { std::cout << "FileInterface()" << std::endl; }
FileInterface(const std::string& name) : _name(name) {}
virtual void add(FileInterface*) {};
virtual void print() const = 0;
protected:
std::string _name;
};
File.h
#pragma once
#include "FileInterface.h"
#include <iostream>
class File : public FileInterface
{
public:
File(const std::string& name) : FileInterface(name) {};
void print() const override
{
std::cout << "-File: " << _name << std::endl;
}
};
Directory.h
#pragma once
#include "FileInterface.h"
#include <vector>
class Directory : public FileInterface
{
public:
Directory(const std::string& name) : FileInterface(name) {}
void add(FileInterface* file) override
{
dierctory.push_back(file);
}
void print() const override
{
std::cout << "+Directory: " << _name << std::endl;
for (auto& file : dierctory)
{
file->print();
}
}
private:
std::vector<FileInterface*> dierctory;
};
main.cpp
#include "Directory.h"
#include "file.h"
#include <iostream>
using namespace std;
int main()
{
FileInterface* root = new Directory("root");
FileInterface* subDir = new Directory("subDir");
FileInterface* file1 = new File("file1");
FileInterface* file2 = new File("file2");
root->add(file1);
root->add(subDir);
subDir->add(file2);
// 输出文件目录
root->print();
// 释放内存
delete root;
delete subDir;
delete file1;
delete file2;
return 0;
}
运行结果如下图所示:
+Directory: root
-File: file1
+Directory: subDir
-File: file2
抽象类优点:调用方只需要依赖接口(抽象类),而不是具体实现类,符合面向接口编程思想。