结构型模式

适配器模式

内容:将一个类的接口转换成客户希望的另一个接口。适配器模式使
得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
两种实现方式:
类适配器:使用多继承
对象适配器:使用组合

角色:
目标接口(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. 【设计模式】三大类:创建型模式、结构型模式、行为型模式

    1 创建型模式 本人理解:以C++为例,创建对象时,用关键字new来创建(实例化)对象.用一个函数或类将new的过程封装起来,就是创建型模式. <设计模式>中的描述: 创建型模式抽象了实例 ...

  2. DesignPattern(四)结构型模式(下)

    上篇链接   https://www.cnblogs.com/qixinbo/p/9023764.html 继续介绍最后三种结构型模式 外观模式 外观模式,也称作 "门面"模式,在 ...

  3. 8、设计模式-结构型模式-适配器模式

    适配器模式 在软件开发中,有时也存在类似这种不兼容的情况 引入一个称之为适配器的角色来协调这些存在不兼容的结构 这种设计方案即为适配器模式 在适配器模式中引入了一个被称为适配器(Adapter)的包装 ...

  4. 结构型模式/设计模式

    结构型模式 涉及如何组合类和对象来获得更大的结构. 结构型类模式: 采用继承机制来组合接口或实现,通常是静态的,类继承方式. 结构型对象模式: 描述如何对对象进行组合,从而获得新功能的一些方法. 相关 ...

  5. 设计模式:结构型模式

    1.概述 结构型模式涉及到如何组合类和对象以获得更大的结构.结构型模式采用继承机制来组合接口或实现.一个简单的例子是采用多重继承方法将两个以上的类组合成一个类,结果这个类包含了所有父类的性质.这个模式 ...

  6. JAVA设计模式--结构型模式

    2019独角兽企业重金招聘Python工程师标准>>> 我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式.装饰模式.代理模式.外观模 ...

  7. .NET设计模式(15):结构型模式专题总结

    .NET设计模式(15):结构型模式专题总结 --探索设计模式系列之十五 Terrylee,2006年5月 摘要:结构型模式,顾名思义讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模 ...

  8. 设计模式 结构型模式 外观模式(Facade Pattern)

    在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化. 这时为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 &quo ...

  9. 设计模式09: Decorator 装饰模式(结构型模式)

    Decorator 装饰模式(结构型模式) 子类复子类,子类何其多 加入我们需要为游戏中开发一种坦克,除了不同型号的坦克外,我们还希望在不同场合中为其增加以下一种多种功能:比如红外线夜视功能,比如水路 ...

  10. 结构型模式:外观模式(门面模式)

    外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这 ...

最新文章

  1. 线段树 ---- Codeforces 737 Div2 D. Ezzat and Grid 维护dp
  2. 从简历筛选看怎么写一篇有亮点的简历
  3. 七个C#编程的小技巧
  4. kafka+zookeeper安装配置
  5. spring+ibatis配置
  6. html对图片轮播脚本怎么调用,【jquery前端开发】可调整的幻灯片(图片轮播)
  7. linux打开pythonshall,linux系统shell脚本后台运行python程序
  8. POST方式提交乱码解决
  9. 2020 年“我爱计算机视觉”视频号最受欢迎视频 Top10!
  10. draggable columns vs copy column name in phpMyAdmin
  11. 如何用 Bash 创建一个二进制发布包
  12. jQuery源码学习(一)
  13. 如何更改项目的发布名称
  14. 让大象飞中的工作法(一)
  15. arm模拟器手机版_ARM模拟器——SkyEye的使用
  16. Macbook Pro 外接显示器后,鼠标滑动延迟
  17. 指出下列程序运行的结果()
  18. CString 彻底解析
  19. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion
  20. linux 搭建Discuz论坛教程-个人实践笔记

热门文章

  1. 离散实验偏序关系满足实验报告C语言,离散数学实验三:偏序关系中盖住关系的求取及格论中有补格的判定...
  2. mysql杨辉三角_实现杨辉三角
  3. 浮点数用大小端存储吗_干细胞存储有什么用,干细胞有必要存储吗
  4. java 汉字排序_java实现中文汉字的首字母排序
  5. java高并发(十一)同步容器
  6. 鹿晗都有AI粉了,为什么AI换脸剧的效果还这么渣?
  7. Python小知识 | 这些技能你不会?(二)
  8. php二维数组拆分成字符串,PHP二维数组切割为字符串并去除重复的值
  9. else if mybatis 嵌套_新手如何书写C++代码,远离深度嵌套的if-else
  10. 浏览器内存不足导致页面崩溃_深度精读:浏览器渲染原理 [8000字图文并茂]