关闭

设计模式之外观模式

1391人阅读 评论(3) 收藏 举报
分类:

原文地址: http://blog.csdn.net/iuhsihsow


外观模式主要是用于对底层细节的封装,当然,要结合每个系统的上层应用。

比如很多三维软件就是对DX或者OpenGL的底层细节进行了封装,可以这么说吧大笑


下面是类图



下面是代码

// 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式
 // 定义了一个高程接口,这个接口使得这一子系统更加容易使用。
 
 
 // 情景假设
 // 某一软件,运行时需要连接数据库,获取数据文本,假设为txt文本
 // 数据库是Oracle,从数据库中取出的是加密过的文件
 // 解密子系统是decryption,解密之后是一个rar,需要解压
 // 解压子系统是rar
 // 现在创建一个facade掩盖此过程,做到用户给一个输入,就能得到输出。
 
 
 // 这个例子比较简单,因为就是封装下接口,不需要用到多态之类的
 // 所以每个类就只声明一个对象即可
 
 // 最终用户知道的细节越少越好,迪米特法则
 
 #include "stdafx.h"
 #include <Windows.h>
 
 //数据库子系统
 class OracleDB
 {
 public:
 	bool GetDataFromDB(long id, byte* &pBuf)
 	{
 		printf("Connect to oracle now!\n");
 		printf("Get data from Oracle now!\n");
 		return true;
 	}
 protected:
 private:
 };
 
 //解密子系统
 class Decryption
 {
 public:
 	bool Decrypt(byte* &pBuf) 
 	{
 		byte *pDecryption = NULL;
 		pBuf = pDecryption;
 		printf("Sucessful Decrypt!\n");
 		return true;
 	}
 protected:
 private:
 };
 
 //解压缩子系统
 class RARSys
 {
 public:
 	bool UnCompress(byte* &pBuf, char* pPath)
 	{
 		byte* pUncompress = NULL;
 		pBuf = pUncompress;
 		printf("Sucessful Uncompress!\n");
 		if (WriteData(pPath))
 		{
 			return true;
 		}
 		
 	}
 protected:
 private:
 	bool WriteData(char* pPath)
 	{
 		printf("Txt is put in this path:\n");
 		printf(pPath);
 		printf("\n");
 		return true;
 	}
 };
 
 
 //外观类
 class Facade
 {
 public:
 	bool GetTxt(long id, char *pPath)
 	{
 		OracleDB	db;
 		Decryption	dp;
 		RARSys		rs;
 		byte *pBuf;
 		db.GetDataFromDB(id, pBuf);
 		dp.Decrypt(pBuf);
 		rs.UnCompress(pBuf, pPath);
 		return true;
 	}
 protected:
 private:
 };
 
 
 int _tmain(int argc, _TCHAR* argv[])
 {
 	Facade fd;
 	fd.GetTxt(100, "D:\\temp.txt");
 	return 0;
 }
 
 
 输出结果:
 //Connect to oracle now!
 //Get data from Oracle now!
 //Sucessful Decrypt!
 //Sucessful Uncompress!
 //Txt is put in this path:
 //D:\temp.txt
 //请按任意键继续. . .



3
1
查看评论

最常用的设计模式---外观模式(C++实现)

外观模式:提供了一个统一的接口,用来访问子系统的一群接口。外观定义了一个高层接口,让子系统更容易使用。目地:让接口变得简单,是为了简化子系统的接口。
  • lh844386434
  • lh844386434
  • 2014-01-09 17:25
  • 1662

c#设计模式==外观模式

外观模式,是一种使用频率非常高的结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便。   不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶、茶具和开水,如图1(...
  • hjf161105
  • hjf161105
  • 2017-07-06 20:53
  • 98

Android重拾设计模式系列——外观模式

定义及实质 定义 为子系统中的一组接口提供一个一致的界面,这个界面使得子系统更加容易使用。 解释:英雄吹响号角(相当于统一界面,用于发动攻击),命令部队对敌军发动攻击;接下来部队里的各种兵种开始对敌军发动攻击。咕噜兵发起了攻击,狼骑发起了攻击,牛头人发起了攻击,风骑士发起了攻击…号角这个统一界...
  • qq_31370269
  • qq_31370269
  • 2016-11-16 12:51
  • 3695

[设计模式](二)外观模式和建造者模式的区别

网上博客很多使用KFC套餐来做的例子,讲述地不够贴切,觉得容易误导读者,在那个例子中KFC的套餐(ConcretedBulider)的具体内容被消费者(Client)清楚地了解且也是其关心的点,但是在建造者模式里消费者并不了解也不关心产品的创建过程,而在例子中建造者(Builder)也只是简单地提供...
  • stephzcj
  • stephzcj
  • 2017-05-22 16:05
  • 458

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是在现阶段各种第三方 SDK 基本很大概率都会使用外观模式。通过一个外观类使得整个系统的接口只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节。当然,在我们...
  • zhao_zepeng
  • zhao_zepeng
  • 2016-07-17 18:14
  • 3484

设计模式 外观模式 一键电影模式

这个模式比较简单,嘿嘿,简单写一下。 老样子,先看 外观模式(Facade Pattern)定义:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用。其实就是为了方便客户的使用,把一群操作,封装成一个方法。 举个例子:我比较喜欢看电影,于是买了投影...
  • lmj623565791
  • lmj623565791
  • 2014-05-14 22:51
  • 9298

Unity3d之设计模式(四)外观模式

一、定义 外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 解释:简单来说,客户端需要调用一个特别复杂的子系统中的多个接口,如果直接调用逻辑处理起来会非常复杂,而且不便于系统扩展。外观模式把这个复杂的子系统统一起来,提供几个高层接口...
  • qq563129582
  • qq563129582
  • 2016-12-15 18:24
  • 694

JAVA设计模式之门面模式(外观模式)

医院的例子   现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其“分而治之”,把一个系统划分为几个较小的子系统。如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、收费、取药等。看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各...
  • jason0539
  • jason0539
  • 2014-04-02 07:16
  • 25919

【设计模式】学习笔记10:外观模式(Facade)

上一次我们已经知道了适配器模式是如何将一个类的接口转换成另一个符合客户期望的接口了。Java中要做到这一点,必须将一个不兼容接口的对象包装起来,变成兼容的对象。 这次要学的是外观模式. 外观模式是将一个或数个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外观。 走近外观模式 假设要用Java设计...
  • shuangde800
  • shuangde800
  • 2013-08-13 00:42
  • 2715

深入浅出设计模式之命令模式、适配器模式、外观模式

命令模式
  • u011531613
  • u011531613
  • 2017-03-22 20:42
  • 479
    个人资料
    • 访问:192393次
    • 积分:3553
    • 等级:
    • 排名:第11017名
    • 原创:105篇
    • 转载:51篇
    • 译文:15篇
    • 评论:37条
    博客专栏
    文章分类
    站长统计