sjms-3 结构型模式
结构型模式
适配器模式
内容:将一个类的接口转换成客户希望的另一个接口。适配器模式使
得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
两种实现方式:
类适配器:使用多继承
对象适配器:使用组合
角色:
目标接口(Target)
待适配的类(Adaptee)
适配器(Adapter)
适用场景:
想使用一个已经存在的类,而它的接口不符合你的要求(对象适配器)想使用一些已经存在的子类,但不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
from abc import ABCMeta, abstractmethodclass Payment(metaclass=ABCMeta):# abstract class@abstractmethoddef pay(self, money):passclass Alipay(Payment):def pay(self, money):print("支付宝支付%d元." % money)class WechatPay(Payment):def pay(self, money):print("微信支付%d元." % money)class BankPay:def cost(self, money):print("银联支付%d元." % money)class ApplePay:def cost(self, money):print("苹果支付%d元." % money)# # 类适配器
# class NewBankPay(Payment, BankPay):
# def pay(self, money):
# self.cost(money)# 把不兼容的转成兼容的
# 当有多个接口不同的类时,这样会导致要写多个类去继承# 对象适配器
class PaymentAdapter(Payment):def __init__(self, payment):self.payment = paymentdef pay(self, money):self.payment.cost(money) # 调用不兼容对象的方法 , 包装 不兼容的接口方法 成兼容的p = PaymentAdapter(BankPay()) # 一个类里放另一个类对象
p.pay(100)# 组合# class A:
# pass
#
# class B:
# def __init__(self):
# self.a = A()
桥模式
内容:
将一个事物的两个维度分离,使其都可以独立地变化。
角色:
抽象(Abstraction)
细化抽象(RefinedAbstraction)
实现者(Implementor)
具体实现者(ConcreteImplementor)
应用场景:
当事物有两个维度上的表现,两个维度都可能扩展时。
优点:
抽象和实现相分离
优秀的扩展能力
from abc import ABCMeta, abstractmethodclass Shape(metaclass=ABCMeta):def __init__(self, color):self.color = color@abstractmethoddef draw(self):passclass Color(metaclass=ABCMeta):@abstractmethoddef paint(self, shape):passclass Rectangle(Shape):name = "长方形"def draw(self):# 长方形逻辑self.color.paint(self)class Circle(Shape):name = "圆形"def draw(self):# 圆形逻辑self.color.paint(self) # 调用color 对象的paint并把self形状对象传过去,方便color的paint打印class Line(Shape):name = "直线"def draw(self):# 直线逻辑self.color.paint(self)class Red(Color):def paint(self, shape):print("红色的%s" % shape.name)class Green(Color):def paint(self, shape):print("绿色的%s" % shape.name)class Blue(Color):def paint(self, shape):print("蓝色的%s" % shape.name)shape = Line(Blue())
shape.draw()shape2 = Circle(Green()) # 先把color对象传过来,以便draw调用# (其实draw调用的时候,是调用color的paint方法,并把shape对象传给paint让它去调用shape的name)
shape2.draw()# 两个维度都可以扩展
组合模式
内容:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
角色:
抽象组件(Component)
叶子组件(Leaf)
复合组件(Composite)
客户端(Client)
from abc import ABCMeta, abstractmethod# 抽象组件
class Graphic(metaclass=ABCMeta):@abstractmethoddef draw(self):pass# 叶子组件
class Point(Graphic):def __init__(self, x, y):self.x = xself.y = ydef __str__(self):return "点(%s, %s)" % (self.x, self.y)def draw(self):print(str(self))# 叶子组件
class Line(Graphic):def __init__(self, p1, p2):self.p1 = p1self.p2 = p2def __str__(self):return "线段[%s, %s]" % (self.p1, self.p2)def draw(self):print(str(self))# 复合组件
class Picture(Graphic): # 组合(组装类)def __init__(self, iterable):self.children = []for g in iterable:self.add(g)def add(self, graphic):self.children.append(graphic)def draw(self):print("------复合图形------")for g in self.children:g.draw()print("------复合图形------")p1 = Point(2,3)
l1 = Line(Point(3,4), Point(6,7)) # 将简单的类对象,作为参数传递进行组合
l2 = Line(Point(1,5), Point(2,8))
pic1 = Picture([p1, l1, l2])p2 = Point(4,4)
l3 = Line(Point(1,1), Point(0,0))
pic2 = Picture([p2, l3])pic = Picture([pic1, pic2])
pic.draw()"""
------复合图形------
------复合图形------
点(2, 3)
线段[点(3, 4), 点(6, 7)]
线段[点(1, 5), 点(2, 8)]
------复合图形------
------复合图形------
点(4, 4)
线段[点(1, 1), 点(0, 0)]
------复合图形------
------复合图形------
"""
适用场景:
表示对象的“部分-整体”层次结构(特别是结构是递归的)
希望用户忽略组合对象与单个对象的不同,用户统一地使用组合结构中的所有对象
优点:
定义了包含基本对象和组合对象的类层次结构
简化客户端代码,即客户端可以一致地使用组合对象和单个对象
更容易增加新类型的组件
外观模式
内容:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
角色:
外观(facade)
子系统类(subsystem classes)
class CPU:def run(self):print("CPU开始运行")def stop(self):print("CPU停止运行")class Disk:def run(self):print("硬盘开始工作")def stop(self):print("硬盘停止工作")class Memory:def run(self):print("内存通电")def stop(self):print("内存断电")class Computer: # Facadedef __init__(self):self.cpu = CPU()self.disk = Disk()self.memory = Memory()def run(self):self.cpu.run()self.disk.run()self.memory.run()def stop(self):self.cpu.stop()self.disk.stop()self.memory.stop()computer = Computer() # 高级别的封装调用,使外观调用一致
computer.run()
computer.stop()
优点:
减少系统相互依赖
提高了灵活性
提高了安全性
代理模式
内容:为其他对象提供一种代理以控制对这个对象的访问。
应用场景:
远程代理:为远程的对象提供代理
虚代理:根据需要创建很大的对象
保护代理:控制对原始对象的访问,用于对象有不同访问权限时
from abc import ABCMeta, abstractmethodclass Subject(metaclass=ABCMeta):@abstractmethoddef get_content(self):pass@abstractmethoddef set_content(self, content):passclass RealSubject(Subject):def __init__(self, filename):self.filename = filenamewith open(filename, 'r', encoding='utf-8') as f:print("读取文件内容")self.content = f.read()def get_content(self):return self.contentdef set_content(self, content):with open(self.filename, 'w', encoding='utf-8') as f:f.write(content)class VirtualProxy(Subject):def __init__(self, filename): # 不直接调用文件,防止文件过大,占到内存到self.filename = filename # 创建对象时不会读取文件内容,self.subj = Nonedef get_content(self):if not self.subj:self.subj = RealSubject(self.filename) # 在调用get_content 时才真正去打开文件return self.subj.get_content()def set_content(self, content):if not subj:self.subj = RealSubject(self.filename)return self.subj.set_content(content)class ProtectedProxy(Subject): # 保护代理def __init__(self, filename):self.subj = RealSubject(filename)def get_content(self):return self.subj.get_content()def set_content(self, content):raise PermissionError("无写入权限")#subj = RealSubject("test.txt")
#subj.get_content()subj = ProtectedProxy("test.txt")
print(subj.get_content())
# subj.set_content("abc")
角色:
抽象实体(Subject)
实体(RealSubject)
代理(Proxy)
优点:
远程代理:可以隐藏对象位于远程地址空间的事实
虚代理:可以进行优化,例如根据要求创建对象
保护代理:允许在访问一个对象时有一些附加的内务处理
sjms-3 结构型模式相关推荐
- 【设计模式】三大类:创建型模式、结构型模式、行为型模式
1 创建型模式 本人理解:以C++为例,创建对象时,用关键字new来创建(实例化)对象.用一个函数或类将new的过程封装起来,就是创建型模式. <设计模式>中的描述: 创建型模式抽象了实例 ...
- DesignPattern(四)结构型模式(下)
上篇链接 https://www.cnblogs.com/qixinbo/p/9023764.html 继续介绍最后三种结构型模式 外观模式 外观模式,也称作 "门面"模式,在 ...
- 8、设计模式-结构型模式-适配器模式
适配器模式 在软件开发中,有时也存在类似这种不兼容的情况 引入一个称之为适配器的角色来协调这些存在不兼容的结构 这种设计方案即为适配器模式 在适配器模式中引入了一个被称为适配器(Adapter)的包装 ...
- 结构型模式/设计模式
结构型模式 涉及如何组合类和对象来获得更大的结构. 结构型类模式: 采用继承机制来组合接口或实现,通常是静态的,类继承方式. 结构型对象模式: 描述如何对对象进行组合,从而获得新功能的一些方法. 相关 ...
- 设计模式:结构型模式
1.概述 结构型模式涉及到如何组合类和对象以获得更大的结构.结构型模式采用继承机制来组合接口或实现.一个简单的例子是采用多重继承方法将两个以上的类组合成一个类,结果这个类包含了所有父类的性质.这个模式 ...
- JAVA设计模式--结构型模式
2019独角兽企业重金招聘Python工程师标准>>> 我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式.装饰模式.代理模式.外观模 ...
- .NET设计模式(15):结构型模式专题总结
.NET设计模式(15):结构型模式专题总结 --探索设计模式系列之十五 Terrylee,2006年5月 摘要:结构型模式,顾名思义讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模 ...
- 设计模式 结构型模式 外观模式(Facade Pattern)
在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化. 这时为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 &quo ...
- 设计模式09: Decorator 装饰模式(结构型模式)
Decorator 装饰模式(结构型模式) 子类复子类,子类何其多 加入我们需要为游戏中开发一种坦克,除了不同型号的坦克外,我们还希望在不同场合中为其增加以下一种多种功能:比如红外线夜视功能,比如水路 ...
- 结构型模式:外观模式(门面模式)
外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这 ...
最新文章
- 线段树 ---- Codeforces 737 Div2 D. Ezzat and Grid 维护dp
- 从简历筛选看怎么写一篇有亮点的简历
- 七个C#编程的小技巧
- kafka+zookeeper安装配置
- spring+ibatis配置
- html对图片轮播脚本怎么调用,【jquery前端开发】可调整的幻灯片(图片轮播)
- linux打开pythonshall,linux系统shell脚本后台运行python程序
- POST方式提交乱码解决
- 2020 年“我爱计算机视觉”视频号最受欢迎视频 Top10!
- draggable columns vs copy column name in phpMyAdmin
- 如何用 Bash 创建一个二进制发布包
- jQuery源码学习(一)
- 如何更改项目的发布名称
- 让大象飞中的工作法(一)
- arm模拟器手机版_ARM模拟器——SkyEye的使用
- Macbook Pro 外接显示器后,鼠标滑动延迟
- 指出下列程序运行的结果()
- CString 彻底解析
- Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion
- linux 搭建Discuz论坛教程-个人实践笔记
热门文章
- 离散实验偏序关系满足实验报告C语言,离散数学实验三:偏序关系中盖住关系的求取及格论中有补格的判定...
- mysql杨辉三角_实现杨辉三角
- 浮点数用大小端存储吗_干细胞存储有什么用,干细胞有必要存储吗
- java 汉字排序_java实现中文汉字的首字母排序
- java高并发(十一)同步容器
- 鹿晗都有AI粉了,为什么AI换脸剧的效果还这么渣?
- Python小知识 | 这些技能你不会?(二)
- php二维数组拆分成字符串,PHP二维数组切割为字符串并去除重复的值
- else if mybatis 嵌套_新手如何书写C++代码,远离深度嵌套的if-else
- 浏览器内存不足导致页面崩溃_深度精读:浏览器渲染原理 [8000字图文并茂]