[Python设计模式] 第12章 基金理财更省事——外观模式
github地址:https://github.com/cheesezh/python_design_patterns
题目1
用程序模拟股民直接炒股的代码,比如股民投资了股票1,股票2,股票3,国债1,房地产1.
class Stock1():
def sell(self):
print("卖出股票1")
def buy(self):
print("买入股票1")
class Stock2():
def sell(self):
print("卖出股票2")
def buy(self):
print("买入股票2")
class Stock3():
def sell(self):
print("卖出股票3")
def buy(self):
print("买入股票3")
class NationalDebt1():
def sell(self):
print("卖出国债1")
def buy(self):
print("买入国债1")
class Realty1():
def sell(self):
print("卖出房地产1")
def buy(self):
print("买入房地产1")
def user_action():
"""
模拟股民的操作,股民需要了解各个理财产品的走势,进而买入卖出
"""
gu1 = Stock1()
gu2 = Stock2()
gu3 = Stock3()
nd1 = NationalDebt1()
rt1 = Realty1()
gu1.buy()
gu2.buy()
gu3.buy()
nd1.buy()
rt1.buy()
gu1.sell()
gu2.sell()
gu3.sell()
nd1.sell()
rt1.sell()
user_action()
买入股票1
买入股票2
买入股票3
买入国债1
买入房地产1
卖出股票1
卖出股票2
卖出股票3
卖出国债1
卖出房地产1
题目2
用程序模拟股民通过基金理财的代码,股民只需要购买&卖出基金即可,不需要对具体的股票等有了解.
class Fund():
def __init__(self):
self.gu1 = Stock1()
self.gu2 = Stock2()
self.gu3 = Stock3()
self.nd1 = NationalDebt1()
self.rt1 = Realty1()
def sell(self):
self.gu1.sell()
self.gu2.sell()
self.gu3.sell()
self.nd1.sell()
self.rt1.sell()
def buy(self):
self.gu1.buy()
self.gu2.buy()
self.gu3.buy()
self.nd1.buy()
self.rt1.buy()
def user_action():
"""
模拟股民的操作,股民只需要买进卖出基金即可
"""
fund = Fund()
fund.buy()
fund.sell()
user_action()
买入股票1
买入股票2
买入股票3
买入国债1
买入房地产1
卖出股票1
卖出股票2
卖出股票3
卖出国债1
卖出房地产1
外观模式
外观模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用[DP]。
多个子系统类
class SubSystemOne():
def method_one(self):
print("子系统方法1")
class SubSystemTwo():
def method_two(self):
print("子系统方法2")
class SubSystemThree():
def method_three(self):
print("子系统方法3")
外观类
class Facade():
def __init__(self):
self.one = SubSystemOne()
self.two = SubSystemTwo()
self.three = SubSystemThree()
def method_a(self):
self.one.method_one()
self.two.method_two()
def method_b(self):
self.two.method_two()
self.three.method_three()
def main():
facade = Facade()
facade.method_a()
facade.method_b()
main()
子系统方法1
子系统方法2
子系统方法2
子系统方法3
点评
外观模式完美的体现了依赖倒转原则和迪米特法则的思想,是非常常用的模式之一。
那么什么时候使用外观模式最好?
- 在设计阶段,应该有意识的将不同的两个层分离,比如经典的三层架构,需要考虑在数据访问层和业务逻辑层,业务逻辑层和表示层的层与层之间简历外观模式,这样可以为复杂的子系统提供一个简单的接口,使得耦合度降低;
- 在开发阶段,子系统往往因为不断重构演化而变得越来越复杂,大多数的模式使用时也都会产生很多很小的类,这本是好事,但是也给外部调用它们的用户程序带来了使用上的困难,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖;
- 在维护阶段,可能一个大型的系统已经非常难以维护和扩展,但是因为它包含了重要功能,新的开发需求必须依赖它,此时也可以使用外观模式。可以为新系统开发一个Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统和Facade对象交互。
[Python设计模式] 第12章 基金理财更省事——外观模式的更多相关文章
- [Python设计模式] 第22章 手机型号&软件版本——桥接模式
github地址:https://github.com/cheesezh/python_design_patterns 紧耦合程序演化 题目1 编程模拟以下情景,有一个N品牌手机,在上边玩一个小游戏. ...
- [Python设计模式] 第25章 联合国维护世界和平——中介者模式
github地址:https://github.com/cheesezh/python_design_patterns 题目背景 联合国在世界上就是中介者的角色,各国之间的关系复杂,类似不同的对象和对 ...
- [Python设计模式] 第10章 怎么出试卷?——模版方法模式
github地址:https://github.com/cheesezh/python_design_patterns 题目 小时候数学老师的随堂测验,都是老师在黑板上写题目,学生在下边抄,然后再做题 ...
- [Python设计模式] 第23章 烤串的哲学——命令模式
github地址:https://github.com/cheesezh/python_design_patterns 题目1 用程序模拟,顾客直接向烤串师傅提需求. class Barbecuer( ...
- [Python设计模式] 第2章 商场收银软件——策略模式
github地址: https://github.com/cheesezh/python_design_patterns 题目 设计一个控制台程序, 模拟商场收银软件,根据客户购买商品的单价和数量,计 ...
- Python Cookbook 笔记--12章并发编程
<Python Cookbook(第3版)中文版> 1.队列queue的有些方法是线程不安全的,在多线程中最好别用 2.需要限制一段代码的并发访问量时,用信号量.不要把信号量当做普通的锁来 ...
- [Python设计模式] 第1章 计算器——简单工厂模式
github地址:https://github.com/cheesezh/python_design_patterns 写在前面的话 """ 读书的时候上过<设计模 ...
- [Python设计模式] 第21章 计划生育——单例模式
github地址:https://github.com/cheesezh/python_design_patterns 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式 ...
- 0基础入门学习Python(第1-2章)
第一章:就这么愉快的开始吧 1.1获取Python Python3.7 1.2从idle启动 Python 3.7.3 (default, Mar 27 2019, 09:23:39)[Clang 1 ...
随机推荐
- 数学建模:2.监督学习--分类分析- KNN最邻近分类算法
1.分类分析 分类(Classification)指的是从数据中选出已经分好类的训练集,在该训练集上运用数据挖掘分类的技术,建立分类模型,对于没有分类的数据进行分类的分析方法. 分类问题的应用场景:分 ...
- Python中元类
元类(metaclass) 简单地说,元类就是一个能创建类的类,而类class 是由type创建的,class可以创建对象 type与object的关系详见:python中type和object 1. ...
- 记录一个chrome 65渲染的bug
前段时间发现一个chrome 65+的BUG(chrome已更新到66,BUG仍然存在),一个元素同时使用了以下样式(失去焦点和css3的Z轴平移0deg),渲染异常 /*bug style*/ fi ...
- D - GCD HDU - 1695 -模板-莫比乌斯容斥
D - GCD HDU - 1695 思路: 都 除以 k 后转化为 1-b/k 1-d/k中找互质的对数,但是需要去重一下 (x,y) (y,x) 这种情况. 这种情况出现 x ,y ...
- VirtWire 向客服发ticket
1 首先需要登录自己的账户 2 点击网页的Open Ticket 3 选择要发送何种类型的ticket 4 写自己的问题,包括一个合适的主题,选择你发ticket是针对哪个vps(一个账户下可以ord ...
- 树形动态规划(树状DP)小结
树状动态规划定义 之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系.利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索的 ...
- 从零开始搭建一个从Win7环境备份至CentOS7的SVN双机备份环境
★几个关键的事项★ 需要关闭防火墙filewalld跟selinux ,在root用户下操作: [root@localhost svnRepos]# systemctl stop firewalld ...
- phtnon 文件操作
1.文件定义 (1).什么是文件? 文件是操作系统为用户或者应用程序提供一个读写硬盘的虚拟单位 文件的核心就是读写,即我们只需要对于进行读写操作,就是对操作系统发起请求,然后由操作系统将用户或者应用程 ...
- C Windows控制台字符版本俄罗斯方块
//一个可以工作在Windows控制台字符界面下的俄罗斯方块 //工作在非图形模式,无需其他库依赖,单个C文件代码即可运行 //支持最高纪录,并且对于纪录进行了加密 //By wrule 2015年1 ...
- C++程序设计方法5:接口设计实例
//例子:旋转方阵填充,要求矩阵大小任意,尺寸在运行时输入 设计思路:从上到下 int main() { cout << "Please input N:"; int ...