13.外观模式--Facade
来源:互联网 发布:安装软件用什么软件源 编辑:程序博客网 时间:2024/05/16 12:17
Facade模式:
Facade模式为子系统的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
Facade模式在什么时候使用最好呢?
这要分三个阶段来说,首先,在设计初期阶段,应该要有意识的将不同的层分离,比如经典的三层架构,就需要考虑在数据访问层和业务逻辑层、业务逻辑层和表示层的层与层之间建立Facade,这样可以为复杂的子系统提供一个简单的接口,使得耦合大大降低。其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式使用时也都会产生很多很小的类,这本来是好事,但也给外部调用它们的用户程序带来了使用上的困难,增加Facade可以提供一个简单的接口,减少它们之间的依赖。第三,在维护一个一流的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为它包含非常重要的功能,新的需求开发必须要依赖于它。此时用Facade也是非常适合的。可以为新系统开发一个Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。
Facade模式典型的结构图为:
以投资股票为例,股民需要了解想购买的所有股票,那么众多的投资者和众多的个股联系太多,即要了解相关个股,又不够专业,而如果投资基金的话,具体是买股票还是债券还是外汇等就不需要关心了,基金经理给你打理好了一切,只需关注基金的盈亏就行了。而这个基金就是Façade。因此,股民买个股可以设计为:一个“股票”基类,然后是继承“股票”的“个股A”,“个股B”,“个股n”,股民需要操作每只股票的接口“买”和“卖”。而股民买个股的设计就变为了:股民直接操作“基金”类的接口,由“基金”去操作个股的“买”,“卖”,债券的“买”,“卖”,…。
下面是Façade的实现代码:
//Facade.h
#ifndef _FACADE_H_
#define _FACADE_H_
// 股票1
class Stock1
{
public:
Stock1();
~Stock1();
void Operation();
protected:
private:
};
// 股票2
class Stock2
{
public:
Stock2();
~Stock2();
void Operation();
protected:
private:
};
// 国债
class NationalDebt
{
public:
NationalDebt();
~NationalDebt();
void Operation();
protected:
private:
};
// 基金
class Fund
{
public:
Fund();
~Fund();
void OperationWrapper();
protected:
private:
Stock1* _stock1;
Stock2* _stock2;
NationalDebt* _subs2;
};
#endif //~_FACADE_H_
//Facade.cpp
#include "Facade.h"
#include <iostream>
using namespace std;
Stock1::Stock1()
{
}
Stock1::~Stock1()
{
}
void Stock1::Operation()
{
cout<<"Stock1::Operation..买股票1"<<endl;
}
Stock2::Stock2()
{
}
Stock2::~Stock2()
{
}
void Stock2::Operation()
{
cout<<"Stock2::Operation..买股票2"<<endl;
}
NationalDebt::NationalDebt()
{
}
NationalDebt::~NationalDebt()
{
}
void NationalDebt::Operation()
{
cout<<"NationalDebt::Operation..买国债"<<endl;
}
Fund::Fund()
{
this->_stock1 = new Stock1();
this->_stock2 = new Stock2();
this->_subs2 = new NationalDebt();
}
Fund::~Fund()
{
delete _stock1;
delete _stock2;
delete _subs2;
}
void Fund::OperationWrapper()
{
this->_stock1->Operation();
this->_stock2->Operation();
this->_subs2->Operation();
}
//main.cpp
#include "Facade.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
// 基金
Fund* f = new Fund();
// 操作基金
f->OperationWrapper();
return 0;
}
- 13.外观模式--Facade
- 13.外观模式--Facade
- Facade模式(外观模式)
- 外观模式(Facade)
- 外观模式(Facade Pattern)
- 外观(Facade)模式
- 外观模式(Facade Pattern)
- Facade(外观)模式
- Facade外观模式
- facade(外观模式)
- Facade 外观模式
- 外观模式(Facade)
- Facade外观模式
- Facade外观模式
- 外观模式Facade
- 外观模式(Facade)
- Facade(外观)模式
- Facade外观模式
- Linux下Intel集成显卡驱动安装
- JAVA时间格式化处理
- C#中几种可以判断是值类型还是引用类型的方法
- vs2008 web应用中 为什么引用不了App_Code里的类
- hadoop 集群优化1
- 13.外观模式--Facade
- WebService大讲堂之Axis2(9):编写Axis2模块(Module) (转)
- 理解JVM笔记(1)
- Oracle dump undo 说明
- 纠结的Sql求助
- 关于axis 2
- 模式语法 — 解说 Perl 兼容正则表达式的语法
- .net 1.1开发遇到的一个鸟问题,不跑page_load方法
- 分享中断号