facade pattern称为外观模式下面这幅图很能说明该模式用于什么地方。
A 方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和个子系统的演化,这种过多的耦合面临很多变化的挑战。 Facade 设计模式则简化外部客户程序和系统间的交互接口,将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦。 Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use--GoF 举例一个汽车有一个发动机子系统,刹车系统,点火系统,燃料供给系统,地盘系统,车灯系统等等系统组成。 我们一般是启动点火系统->燃料公给系统->发动机子系统->地盘系统 形成汽车的启动 停车:刹车系统->发动机系统->燃料供给系统->车灯系统 转弯:发动机系统->地盘系统->车灯系统 如果教我们客户一个个去完成汽车的个个操作,过程是调用各个子系统,一方面造成客户操作依赖这些子系统,同时造成操作复杂化。
引入外观模式相当于为该汽车引入语音控制系统。 客户喊出:“启动” 由语音系统完成对各个子系统的调用,完成启动动作 客户喊出:“停车” 由语音系统完成各个子系统的调用完成停车动作 客户喊出: “左转弯” ..... 等等一些简单的操作命令。这些命令相当于接口,由客户直接调用。帮助客户使用这些子系统。 class brakeSystem
{
public:
void Start( );
void Stop( );
};
void brakeSystem::Start( )
{
std::cout<<"brake Open"<<std::endl;
}
void brakeSystem::Stop( )
{
std::cout<<"brake Close"<<std::endl;
}
class lightSystem
{
public:
void Start( );
void Stop( );
};
void lightSystem::Start( )
{
std::cout<<"light Start"<<std::endl;
}
void lightSystem::Stop( )
{
std::cout<<"light Stop"<<std::endl;
}
class engineSystem
{
public:
void Start( );
void Change( );
void Stop( );
};
void engineSystem::Start( )
{
std::cout<<"engine Start"<<std::endl;
}
void engineSystem::Stop( );
{
std::cout<<"engine Stop"<<std::endl;
}
void engineSystem::Change( )
{
std::cout<<"engine Change"<<std::endl;
}
class fuelSystem
{
public:
void Start( );
void Stop( );
};
void fuelSystem::Start( )
{
std::cout<<"fuel Open"<<std::endl;
}
void fuelSystem::Stop( )
{
std::cout<<"fuel Close"<<std::endl;
}
class fireSystem
{
public:
void fireStart( );
void fireStop( );
};
void fireSystem::Start( )
{
std::cout<<"fire Start"<<std::endl;
}
void fireSystem::Stop( )
{
std::cout<<"fire Stop"<<std::endl;
}
class domainSystem
{
public:
void Start( );
void Stop( );
};
void domainSystem::Start( )
{
std::cout<<"domain Start"<<std::endl;
}
void domainSystem::Stop( )
{
std::cout<<"domain Stop"<<std::endl;
}
class voiceSystem
{
public:
voiceSystem( );
~voiceSystem( );
void carStart( );
void carStop( );
void carTurnLeft( );
private:
brakeSystem * bs;
engineSystem *es;
fireSystem *fs;
domainSystem *ds;
fuleSystem *fus;
lightSystem *ls;
}
voiceSystem::voiceSystem( )
:bs(new brakeSystem( )),
es(new engineSystem( )),
fs(new fireSystem( )),
ds(new domain( )),
fus(new fuleSystem( )),
ls(new lightSystem( )
{}
voiceSystem::~voiceSystem( )
{
delete bs;
delete es;
delete fs;
delete ds;
delete fus;
delete ls;
}
voiceSystem::carStart( )
{
//点火子系统
fs->Start( );
fs->Stop( );
//燃料子系统
fus->Start( );
//发动机子系统
es->Start( );
//地盘子系统
ds->Start( );
}
voiceSystem::carStop( )
{
//刹车子系统
bs->Start( );
//发动机子系统
es->Stop( );
//燃料子系统
fus->Stop( );
//刹车子系统
bs->Stop( );
//车灯子系统
ls->Start( );
ls->Stop( );
}
voiceSystem::carTurnLeft( )
{
//发动机子系统
es->Change( );
//地盘系统
ds->Start( );
//车灯子系统
ls->Start( );
ls->Stop( );
}
int main( int argc,char ** argv)
{
vocieSystem vs;
vs.carStart( );
vs.carTurnLeft( );
vs.carStop( );
return 0;
}
如果有兴趣可以继续浏览该系列文章: singleton pattern--单件模式 factory mothed pattern--工厂方法模式 abstract factory pattern--抽象工厂模式 builder pattern--建造者模式 prototype pattern--原型模式 adapter pattern--适配器模式 bridge pattern -- 桥接模式
composite pattern -- 组合模式 decorator pattern -- 装饰模式