用C++跟你聊聊“外观模式”
从买股票的故事说起
新手接触股票时,总是容易亏钱,不论是熊市还是牛市。
为啥嘞,作为一个外行人,我觉得新手散户需要有莫大的勇气和智慧去面对种类繁多的个股,一不小心就跌了跟头。
那为什么不找个专业人士带呢?比如把钱放进基金。我知道,赚的少嘛。如果是我,我会选择放基金,自己买一支学习股。毕竟人家是专业的,我们没必要用我们的业余去挑战人家吃饭的本事。
软件开发,程序编写的过程,又何尝不似这股票买卖,我们就是散户,面对一大堆的接口,我们难免要头皮发麻然后“赔本离场”。那么,有没有什么好的办法,就像找一个基金代理人那样?有的,那就是外观模式。
外观模式UML
示例代码
#include<iostream>
using namespace std;
class Stock1 {
public:
void sell() { cout << "股票1卖出" << endl; }
void buy() { cout << "股票1买入" << endl; }
};
class Stock2 {
public:
void sell() { cout << "股票2卖出" << endl; }
void buy() { cout << "股票2买入" << endl; }
};
class Stock3 {
public:
void sell() { cout << "股票3卖出" << endl; }
void buy() { cout << "股票3买入" << endl; }
};
class Funk {
private:
Stock1 *gu1;
Stock2* gu2;
Stock3* gu3;
public:
Funk() {
gu1 = new Stock1();
gu2 = new Stock2();
gu3 = new Stock3();
}
void buy() {
gu1->buy();
gu2->buy();
gu3->buy();
}
void sell() {
gu1->sell();
gu2->sell();
gu3->sell();
}
};
int main()
{
Funk* my_funk = new Funk();
my_funk->buy();
my_funk->sell();
return 0;
}
我在哔哔两句
这平淡无奇的代码设计,却无法掩盖住外观模式的光芒。几乎每个项目开发、软件设计都要用到外观设计。
可能会觉得是固定代码的堆砌,死代码。但是我想举个栗子,就算是cout<<" "<<endl;
这样的打印函数,它右何尝不是外观模式的体现呢?
不开玩笑,如果你不用这些外观模式打包好的接口iucn,大可以自己去调用底层函数,怕是连头文件都要找不到吧哈哈哈。
外观的优势
外观模式的优点非常显而易见,对客户屏蔽了内部系统实现,客户的接入成本大大降低,耦合度也变得简单。并且,子系统的变更,对客户的影响也降低,虽然用户也需要修改代码,但是大多时候只需要修改外观即可。同时,外观模式虽然提供了一个统一的入口,但并不妨碍用户直接使用子系统,使用更加复杂的功能。当然,凡事有利必有弊,外观设计模式存在什么问题呢?虽然外观模式提供了一个入口,但是并不能阻止业务方直接调用子系统,可能会给人这样一种感觉,业务方一定是这么用的,不会产生bug,从而让人麻痹,所以,使用外观模式,同时也要对子系统做好保护。其次,外观模式实际上违背了设计模式中的开闭原则,如果我们要修改业务逻辑,常常业务方也需要进行代码修改。那么,什么样的情况下适合使用外观模式呢?如果我们的调用方用到的场景都是一样的,但我们的子系统又非常地复杂,我们可以考虑封一个外观,让业务方更容易接入。
- HDUOJ-------1753大明A+B(大数之小数加法)
- HDUOJ---1754 I Hate It (线段树之单点更新查区间最大值)
- HDUOJ----1166敌兵布阵(线段树单点更新)
- poj----2155 Matrix(二维树状数组第二类)
- poj------2352 Stars(树状数组)
- HDUOJ-----2852 KiKi's K-Number(树状数组+二分)
- nyoj----522 Interval (简单树状数组)
- HDUOJ-----2838Cow Sorting(组合树状数组)
- HDUOJ---2642Stars(二维树状数组)
- HDUOJ -----Color the ball
- poj-----Ultra-QuickSort(离散化+树状数组)
- HDUOJ---1241Oil Deposits(dfs)
- HDUOJ------2398Savings Account
- HDUOJ-----2399GPA
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法