意图:定义一个服务的抽象接口,而将实现延迟到子类中,使得子类可以在不改变服务的抽象接口的情况下就可以重新定义其特定的具体实现。
UML
AbstractServer:定义抽象的服务接口。
ConcreteServer:实现抽象的服务接口以完成特定的、变化的实现。
Client:使用抽象的服务接口提供的服务,不依赖抽象服务的任何具体实现。该模式是DIP(依赖倒置)原则的直接体现。
注意:AbstractServer应该从Client的角度出发进行命名,因为接口属于Client,而不是其实现,Client与接口之间的绑定关系要强于派生类和接口之间的绑定关系。
代码
#include <iostream>
#include <list>
using namespace std;
class AbstractServer
{
public:
virtual void request() = 0;
virtual ~AbstractServer(){
}
};
class ConcreteServer1:public AbstractServer
{
public:
void request(){
cout << "实体服务1为您服务" << endl;
}
};
class ConcreteServer2:public AbstractServer
{
public:
void request(){
cout << "实体服务2为您服务" << endl;
}
};
class Client{
public:
enum serverType{SERVER1,SERVER2};
static AbstractServer *getServer(serverType type){
switch(type){
case SERVER1:
return new ConcreteServer1();
break;
case SERVER2:
return new ConcreteServer2();
break;
}
}
static void freeServer(AbstractServer *server){
delete server;
}
};
int main(void)
{
cout << "使用服务1" << endl;
AbstractServer * server1 = Client::getServer(Client::SERVER1);
server1->request();
Client::freeServer(server1);
cout << "使用服务2" << endl;
AbstractServer * server2 = Client::getServer(Client::SERVER2);
server2->request();
Client::freeServer(server2);
return 0;
}
结果
使用服务1
实体服务1为您服务
使用服务2
实体服务2为您服务