#include<iostream>
using namespace std;
//抽象层,可以声明很多大的抽象类
//这些功能接口是通用的
class Cpu
{
public:
virtual void compute() = 0;
};
class Disk
{
public:
virtual void store() = 0;
};
class Gpu
{
public:
virtual void display() = 0;
};
class Computer
{
public:
Computer(Cpu *cpu,Gpu *gpu,Disk *disk)
{
cout<<"Computer(Cpu *cpu,Gpu *gpu,Disk *disk)"<<endl;
this->cpu = cpu;
this->gpu = gpu;
this->disk = disk;
}
~Computer()
{
cout<<"~Computer"<<endl;
}
void work()
{
this->cpu->compute();
this->gpu->display();
this->disk->store();
}
private:
Cpu *cpu;
Gpu *gpu;
Disk *disk;
};
//实现层
//可以理解为某些厂商具体了上面的那些通用接口
//比如生产GPU的有英伟达、高通,不管他们内部是怎么做的,只需要满足接口标准
class Nvidia:public Gpu
{
public:
virtual void display()
{
cout<<"NVIDIA dispaly"<<endl;
}
};
class Kingston:public Disk
{
public:
virtual void store()
{
cout<<"KINGSTON store"<<endl;
}
};
//Cpu的一种实现
class Intel:public Cpu
{
public:
virtual void compute()
{
cout<<"Intel i7 compute"<<endl;
}
};
//Cpu的另一种实现
class AMD:public Cpu
{
public:
virtual void compute()
{
cout<<"AMD Ryzen 7 compute"<<endl;
}
};
//业务层,可以理解为组装电脑
//或者让电脑去做某些事情
void computer_work(Computer &computer)
{
computer.work();
}
int main(void)
{
//定义了一个因特尔的cpu
Cpu *c1 = new Intel;
//定义了另一块cpu为AMD的
Cpu *c2 = new AMD;
//显卡
Gpu *g = new Nvidia;
//硬盘
Disk *d = new Kingston;
//只要定义好了通用的硬件标准
//各个厂商按需要去实现
//随便传入任何不同厂商的硬件组合都能产生新的电脑
Computer computer1(c1,g,d);
Computer computer2(c2,g,d);
//而且符合通用接口标准的电脑也能随时就运行
//而无需管你具体用了哪些硬件
computer_work(computer1);
computer_work(computer2);
return 0;
}
这种定义抽象类,然后不管具体实现,能降低编程的耦合度,有利于程序拓展。