设计原则之一:
迪米特法则:如果两个类不必直接通信,那么两个类就不应该发生直接的相互作用;
如果一个类要调用另一个类中的某个方法的话,可以通过第三者转发这个调用;
具体说明如下:
(1)该法则强调的是在类的结构设计中,每个类都应尽量降低自己成员的访问权限;
(2)其根本思想是强调了类之间的松耦合;
(3)类之间的耦合越弱,越有利于复用,一个处于弱耦合的类被修改,不会对有关系的类造成涉及;
(4)信息的隐藏促进了软件的复用;
外观模式/门面模式:
为子系统中的一个接口提供了一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易可用;
外观模式UML类图如下:
炒股基金外观模式应用代码示例:
外观类和子系统图类接口facade.h
#pragma once
#include <iostream>
#include <string>
using namespace std;
class SubSystemOne
{
public:
void methodone(){cout << "methodone" << endl;}
};
class SubSystemTwo
{
public:
void methodtwo(){cout << "methodtwo" << endl;}
};
class SubSystemThree
{
public:
void methodthree(){cout << "methodthree" << endl;}
};
class SubSystemFour
{
public:
void methodfour(){cout << "methodfour" << endl;}
};
//外观类,它需要了解所以子系统的方法或属性,进行组合,以备外界调用
class Facade
{
private:
SubSystemOne *one;
SubSystemTwo *two;
SubSystemThree *three;
SubSystemFour *four;
public:
Facade()
{
one=new SubSystemOne();
two=new SubSystemTwo();
three=new SubSystemThree();
four=new SubSystemFour();
}
void methodA()
{
cout << "methodA" << endl;
one->methodone();
two->methodtwo();
four->methodfour();
}
void methodB()
{
cout << "methodB" << endl;
two->methodtwo();
three->methodthree();
}
};
客户端代码如下:
#include "facade1.h"
int main()
{
Facade *facade = new Facade();
facade->methodA();//由于Facade的存在,客户端可以根本不知道4个子系统的存在
facade->methodB();
return 0;
}
代码输出如下:
外观模式适用场合:
设计初期,应该有意识的将两个层分离,在层与层之间建立外观Facade;
其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖;
在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,可以为新系统开发一个外观Facade类,来提供粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作;