有些时候,我们需要把一大堆复杂的接口简化后呈现给用户。
/****************************************************
CEquipments.h
****************************************************/
/*
电视、空调、电脑、DVD机、音箱等设备
*/
#pragma once
#include <iostream>
using namespace std;
class CTV
{
public:
void start(){
cout<<"Turn on TV"<<endl;
}
void change(){
cout<<"Tv program changed!"<<endl;
}
};
class CAirCondition
{
public:
void start(){
cout<<"Turn on the air condition"<<endl;
}
void upT(){
cout<<"temperature up..."<<endl;
}
void downT(){
cout<<"temperature down..."<<endl;
}
};
class CPc
{
public:
void start(){
cout<<"Turn on the PC"<<endl;
}
};
class CDvd
{
public:
void start(){
cout<<"Turn on the Dvd"<<endl;
}
};
//////////////////////////////////////////////////
//外观模式,将这以上类的对象进行包装,可以有一个简单的按钮来打开所有这个类的实例。
//但我们还同可以可使用原对象的底层的操作。
class CApperance
{
private:
CTV* m_tv;
CAirCondition* m_Aircondition;
CPc* m_pc;
CDvd* m_dvd;
public:
CApperance(CTV* inTV, CAirCondition* inAC, CPc* inPc, CDvd* inDvd) :
m_tv(inTV), m_Aircondition(inAC), m_pc(inPc), m_dvd(inDvd){
}
void TurnOnAll(){
m_tv->start();
m_Aircondition->start();
m_pc->start();
m_dvd->start();
}
};
/******************************************************
testAppearancePattern.cpp
******************************************************/
/*
设计模式: 外观模式
外观只是提供我们更直接的操作,并未将原来的子系统阻隔起来。如果我们需要子系统类的更高层功能,还是可以使用原来的子系统。
简单地说:外观类有(has-a)很多子系统的对象(的引用或者指针),它提供了一个简化的接口可以将子系统对象的方法打包放入这个接口中。
eg: 家里有电视、空调、电脑、DVD机、音箱等设备,要同时开起来看电影的话,就需要一个个去按按钮,
那么,这时我们就可以设一个开关,同时把这些设备都打开了。但同时,我们还是可以单独
@@@@@@@@@@@@@@@@@@@@@@@@@@@
这个例子就是做了上面这件事
@@@@@@@@@@@@@@@@@@@@@@@@@@@
适配器模式与外观模式的区别:
1. 适配器模式的意图是,“改变”接口符合客户的期望;而外观模式的意图是,提供子系统的一个简化接口。它们均可以包装一个或者多个类。
2. 外观不只是简化了接口,也将客户从组件的子系统中解耦了。
这两个模式也有装饰者有着本质上的不同:
装饰者将一个对象包装起来以增加新的行为和责任。而这两个模式是不会新增加行为和责任的。
by 何戬, hejian@cad.zju.edu.cn
*/
#include <iostream>
#include "CEquipments.h"
using namespace std;
int main()
{
CTV* tv = new CTV();
CAirCondition* ac = new CAirCondition();
CPc* pc = new CPc();
CDvd* dvd = new CDvd();
//生成外观模式的实例
CApperance* ap = new CApperance(tv, ac, pc, dvd);
//统一化操作
ap->TurnOnAll();
//仍然可以对每个对象进行单一操作
tv->change();
ac->upT();
delete ap;
delete dvd;
delete pc;
delete ac;
delete tv;
return 0;
}