设计模式二:结构型模式
一、适配器模式
将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
角色:
目标接口(Target)
待适配的类(Adaptee)
适配器(Adapter)
两种实现方式:
类适配器:使用多继承
对象适配器:使用组合
适用场景:
想使用一个已经存在的类,而它的接口不符合你的要求 (对象适配器)想使用一些已经存在的子类,但不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
# coding : utf-8 # create by ctz on 2017/5/25from abc import abstractmethod, ABCMetaclass Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):raise NotImplementedErrorclass Alipay(Payment):def pay(self, money):print("支付宝支付%s元"%money)class ApplePay(Payment):def pay(self, money):print("苹果支付%s元"%money)#------待适配类------class WechatPay:def huaqian(self, a, b):print("微信支付%s元"%(a+b))#------类适配器------class RealWeChatPay(Payment, WechatPay):def pay(self, money):return self.huaqian(money, 0)#------对象适配器------ class PayAdapter(Payment):def __init__(self, payment):self.payment = paymentdef pay(self, money):return self.payment.huaqian(money, 0)#RealWeChatPay().pay(100) PayAdapter(WechatPay()).pay(1000)
View Code
二、组合模式
将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
角色:
抽象组件(Component)
叶子组件(Leaf)
复合组件(Composite)
客户端(Client)
适用场景:
表示对象的“部分-整体”层次结构(特别是结构是递归的) 希望用户忽略组合对象与单个对象的不同,用户统一地使用组合结构中的所有对象
优点:
定义了包含基本对象和组合对象的类层次结构 简化客户端代码,即客户端可以一致地使用组合对象和单个对象 更容易增加新类型的组件
缺点:
很难限制组合中的组件
# coding : utf-8 # create by ctz on 2017/5/25from abc import abstractmethod, ABCMetaclass Graphic(metaclass=ABCMeta):@abstractmethoddef draw(self):pass@abstractmethoddef add(self, graphic):pass@abstractmethoddef getchildren(self):passclass Point(Graphic):def __init__(self, x, y):self.x = xself.y = ydef draw(self):print(self)def add(self, graphic):raise TypeErrordef getchildren(self):raise TypeErrordef __str__(self):return "点(%s, %s)" % (self.x, self.y)class Line(Graphic):def __init__(self, p1, p2):self.p1 = p1self.p2 = p2def draw(self):print(self)def add(self, graphic):raise TypeErrordef getchildren(self):raise TypeErrordef __str__(self):return "线段[%s, %s]" % (self.p1, self.p2)class Picture(Graphic):def __init__(self):self.children = []def add(self, graphic):self.children.append(graphic)def getchildren(self):return self.childrendef draw(self):print("------复合图形------")for g in self.children:g.draw()print("------END------")pic1 = Picture() pic1.add(Point(2,3)) pic1.add(Line(Point(1,2), Point(4,5))) pic1.add(Line(Point(0,1), Point(2,1)))pic2 = Picture() pic2.add(Point(-2,-1)) pic2.add(Line(Point(0,0), Point(1,1)))pic = Picture() pic.add(pic1) pic.add(pic2)pic.draw()
View Code
三、代理模式
为其他对象提供一种代理以控制对这个对象的访问
角色:
抽象实体(Subject)
实体(RealSubject)
代理(Proxy)
适用场景:
远程代理:为远程的对象提供代理
虚代理:根据需要创建很大的对象
保护代理:控制对原始对象的访问,用于对象有不同访问权限时
优点:
远程代理:可以隐藏对象位于远程地址空间的事实
虚代理:可以进行优化,例如根据要求创建对象
保护代理:允许在访问一个对象时有一些附加的内务处理
# coding : utf-8 # create by ctz on 2017/5/26from abc import ABCMeta, abstractmethodclass Subject(metaclass=ABCMeta):@abstractmethoddef get_content(self):passclass RealSubject(Subject):def __init__(self, filename):self.filename = filenameprint("读取%s文件内容"%filename)f = open(filename)self.content = f.read()f.close()def get_content(self):return self.contentdef set_content(self, content):f = open(self.filename, 'w')f.write(content)f.close()class ProxyA(Subject):def __init__(self, filename):self.subj = RealSubject(filename)def get_content(self):return self.subj.get_content()class ProxyB(Subject):def __init__(self, filename):self.filename = filenameself.subj = Nonedef get_content(self):if not self.subj:self.subj = RealSubject(self.filename)return self.subj.get_content()class ProxyC(Subject):def __init__(self, filename):self.subj = RealSubject(filename)def get_content(self):return self.get_content()def set_content(self):raise PermissionError# 写一个set_content b = ProxyB("abc.txt") #print(b.get_content())
View Code
其他不一一列举了,这几个我感觉比较重要
转载于:https://www.cnblogs.com/ctztake/p/8409389.html
设计模式二:结构型模式相关推荐
- 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)
本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...
- 设计模式之结构型模式(5种)
目录 结构型模式(Structural Pattern):怎么构造一个对象(行为.属性) 一.适配器模式 二.桥接模式(Bridge) 三.装饰者模式 设计模式在JAVA I/O库中的应用 案例 使用 ...
- JAVA23种设计模式(2)-结构型模式7种
JAVA23种设计模式(2)-结构型模式7种 把类结合在一起形成更大的结构 适配器模式(adapter) 一句话:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容 这是平时比较常见的一种模 ...
- 设计模式_结构型模式学习
其中,单例模式用来创建全局唯一的对象.工厂模式用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象.建造者模式是用来创建复杂对象,可以通过设置不同的可 ...
- 设计模式 之 结构型模式
设计模式 之 结构型模式 模式 & 描述 包括 结构型模式 这些设计模式关注类和对象的组合.继承的概念被用来组合接口和定义组合对象获得新功能的方式. 适配器模式(Adapter Pattern ...
- 组合模式(Bridge Pattern) – 设计模式之结构型模式
组合模式(Bridge Pattern) – 设计模式之结构型模式: 目录 组合模式(Component Pattern) 类图 例子1: 过程: 类图: 代码: 抽象组件:PlayerComposi ...
- 设计模式(17)-----结构型模式-----外观设计模式
假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情 ...
- 设计模式3——结构型模式
结构型模式描述如何将类或对象按某种布局组成更大的结构,它分为类结构型和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足&q ...
- 设计模式:结构型模式-桥接、外观、组合、享元模式
结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦 ...
最新文章
- 线程池ThreadPool知识碎片和使用经验速记
- Hibernate统计表中的条数
- sql server:查詢系統表
- Linux 线程(1):线程概述
- 技术面试问项目难题如何解决的_技术创新 | 降本增效,青海农信社项目小伙刻苦钻研解决联合支架设计难题!...
- 百度百科推广大师 v1.7.6.1
- CVPR 2019 Oral | 华科开源效果超群的人体姿态迁移算法
- 【Matplotlib】【Python】如何使用matplotlib颜色映射
- Django的认证系统(auth)
- android gps转换度分秒,如何将GPS数据转换为度分秒
- kaptcha谷歌验证码工具
- 小米笔记本linux系统下载软件,小米笔记本用什么系统 小米笔记本电脑将预装Linux系统...
- 利用vCard实现电子名片扫码将个人信息保存到通讯录
- 【原创】objdump 的使用
- arch linux安装命令,arch linux:安装Arch Linux方法介绍
- Linux下riscv-openocd调试环境搭建
- 布斯乘法算法的流程图
- sklearn入门——聚类算法KMeans
- jQuery.Deferred() 方法
- 算法工程师5——计算机视觉知识点概览