外观模式
为了系统中的一组接口提供一个一致的界面;定义了一个高层接口,使得子系统更加容易使用。
即对底层逻辑和接口进行一次整合封装。以至于外部能更容易的使用。
结构图:
代码:
//子系统的四个类
class SubSystemOne
{
void MethodOne();
}
class SubSystemTwo
{
void MethodTwo();
}
class SubSystemThree
{
void MethodThree();
}
class SubSystemfour
{
void MethodFour();
}
//外观类,整合子系统,为外部提供更方便的统一接口
class Facade
{
SubSystemOne One;
SubSystemTwo Two;
SubSystemThree Three;
SubSystemfour Four;
faceade()
{
One = new SubSystemOne();
Two = new SubSystemTwo();
Three = new SubSystemThree();
Four = new SubSystemfour();
}
//供外部调用的整合接口A
void MethodA()
{
One.MethodOne();
Two.MethodTwo();
}
//供外部调用的整合接口B
void MethodB()
{
One.MethodOne();
Four.MethodFour();
}
}
//客户端
Facade cFacade = new Facade();
Facade.MethodA();//客户端根本无需知道子系统细节,只依赖外观类即可,完美符合依赖倒转和迪米特法则
Facade.MethodB();
使用时机:
设计初期将不同的层分离时在层与层之间建立外观;
开发阶段,使用外观封装子系统。
面对遗留的高复杂度或粗糙代码时,使用外观封装它。
优点:完美符合依赖倒转、迪米特法则。外部无需了解子系统细节,只依赖外观类;子系统也只需要对外观类实现支持,实现了子系统和外部的松耦合。
缺点:增加新的子系统可能需要修改外观类或客户端,违背了“开闭原则”。