外观模式:

  外部通过一个统一的接口,访问子系统中的一群接口。外观模式定义了一个高层接口,为子系统中的一组接口提供一个一致的入口,使得子系统更容易使用。外观模式相对比较简单,可以理解为中介,原先租房需要自己一个个筛选,联系房东,谈好价格,签合同等等,现在不需要这些了,只要你说出要求中介就会将房子找好,你只需要掏钱签合同就可以了,不需要关系其他琐碎的事情。

外观模式的角色:

  1. 外观角色:为多个子系统对外提供一个共同的接口;
  2. 子系统角色:实现系统的部分功能,客户可以通过外观角色访问它;
  3. 客户角色:通过一个外观角色访问各个子系统的功能。

优点:

外观模式是迪米特法则的典型应用。

  1. 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类;
  2. 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易;
  3. 降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。

缺点:

  1. 不能很好的限制客户使用子系统;
  2. 违背了开闭原则

eg:

class SysOne {
public:
	SysOne();
	virtual ~SysOne();
	void FuncOne(){
		cout<<"FuncOne"<<endl;
	}
};
 
class SysTwo {
public:
	SysTwo ();
	virtual ~SysTwo ();
	void FuncTwo(){
		cout<<"FuncTwo"<<endl;
	}
};
 
class SysThree {
public:
	SysThree ();
	virtual ~SysThree ();
	void FuncThree(){
		cout<<"FuncThree"<<endl;
	}
};
//------------------------
class Facade {
public:
	Facade(){
		p1 = new SysOne();
		p2 = new SysTwo();
		p3 = new SysThree();
	}
 
	void FuncA(){
		p1->FuncOne();
		p2->FuncTwo();
	}
	void FuncB(){
		p1->FuncOne();
		p3->FuncThree();
	}
	virtual ~Facade();
private:
 
	SysOne *p1;
	SysTwo *p2;
	SysThree *p3;
 
};

	Facade * p =new Facade();
	p->FuncA();