设计模式(C++实现)(十八)——外观模式

示例问题:

有三个子系统,客户程序需要使用这三个子系统的接口,而无需考虑子系统内部的实现。

分析:

这是不是我们平时编程中常用到的一种方法,将一系列问题封装成一个子系统,然后提供子系统的接口给其他程序调用。其实这种思维就是外观模式的设计思维。

解决方案:

Facade.h

该文件中CClassA、CClassB、CClassC只是示例子系统中的功能,CSubSystemA、CSubSystemB、CSubSystemC为三个子系统,这三个子系统分别对外暴露了方法。

#pragma once

#include <iostream>

//类A
class CClassA
{
public:
	CClassA()
	{

	}

	virtual ~CClassA()
	{

	}

	void MethodA()
	{
		std::cout << "执行A类的方法A" << std::endl;
	}
};

//类B
class CClassB
{
public:
	CClassB()
	{

	}

	virtual ~CClassB()
	{

	}

	void MethodB()
	{
		std::cout << "执行B类的方法B" << std::endl;
	}
};

//类C
class CClassC
{
public:
	CClassC()
	{

	}

	virtual ~CClassC()
	{

	}

	void MethodC()
	{
		std::cout << "执行C类的方法C" << std::endl;
	}
};

//类D
class CClassD
{
public:
	CClassD()
	{

	}

	virtual ~CClassD()
	{

	}

	void MethodD()
	{
		std::cout << "执行D类的方法D" << std::endl;
	}
};

//子系统A
class CSubSystemA
{
public:
	CSubSystemA()
	{

	}

	virtual ~CSubSystemA()
	{

	}

	void SubSysAMethodA()
	{
		m_ClassA.MethodA();
		m_ClassD.MethodD();
		m_ClassB.MethodB();
	}

	void SubSysAMethodB()
	{
		m_ClassB.MethodB();
		m_ClassD.MethodD();
	}

private:
	CClassA m_ClassA;
	CClassB m_ClassB;
	CClassD m_ClassD;
};

//子系统B
class CSubSystemB
{
public:
	CSubSystemB()
	{

	}

	virtual ~CSubSystemB()
	{

	}

	void SubSysBMethod()
	{
		m_ClassD.MethodD();;
	}

private:
	CClassD m_ClassD;
};

//子系统C
class CSubSystemC
{
public:
	CSubSystemC()
	{

	}

	virtual ~CSubSystemC()
	{

	}

	void SubSysCMethod()
	{
		m_ClassA.MethodA();
		m_ClassD.MethodD();
	}

private:
	CClassA m_ClassA;
	CClassD m_ClassD;
};

main.cpp

// main.cpp : 定义控制台应用程序的入口点。
//

#include "Facade.h"


int main()
{
	CSubSystemA SubSystemA;
	std::cout << "子系统A方法A执行:" << std::endl;
	SubSystemA.SubSysAMethodA();
	std::cout << "子系统A方法B执行:" << std::endl;
	SubSystemA.SubSysAMethodB();

	CSubSystemB SubSystemB;
	std::cout << "子系统B方法执行:" << std::endl;
	SubSystemB.SubSysBMethod();

	CSubSystemC SubSystemC;
	std::cout << "子系统C方法执行:" << std::endl;
	SubSystemC.SubSysCMethod();
	
	system("pause");
    return 0;
}

执行结果:

外观模式的使用:

外观模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一个子系统更加容易使用。

外观模式其实就是我们平时编程中常用到的一种方法,将一系列问题封装成一个子系统,然后提供子系统的接口给其他程序调用。外观模式完美地体现了依赖倒转原则和迪米特法则的思想。

MVC模式就是该思想,为将M、V、C分成子系统或者叫做模块,然后暴露子系统的接口来实现子系统之间的交互,从而实现全部的逻辑交互。

何时使用外观模式:

1. 在设计初期阶段,应该要有意识的将不同的两个层分离,比如经典的三层架构,就需要考虑在数据访问层和业务逻辑层、业务逻辑层和表示层的层和层之间建立外观Facade,这样可以为复杂的子系统提供一个简单的接口,使得耦合大大降低;

2. 在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式使用时也都会产生很多很小的类,这本是好事,但也给外部调用他们的用户程序带来了使用上的困难,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖;

3. 在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为它包含非常重要的功能,新的需求开发必须要依赖于它。此时用外观模式Facade也是非常合适的。可以为新系统开发一个外观Facade来,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。

 

返回目录:设计模式(C++实现)(总)

上一篇:设计模式(C++实现)(十七)——原型模式

下一篇:设计模式(C++实现)(十九)——访问者模式

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值