#写在前面

已经有一个礼拜多没写博客了,因为沉醉在了《妙味》这部小说里,里面讲的是一个厨师苏秒的故事。现实中大部分人不会有她的天分。我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人过。我还喜欢里面那些描写味道的文字,这会让我认真对待一日三餐。我还喜欢里面的一种态度,做事的时候要认真专注。我是个很容易急躁的人,特别是当做自己不太喜欢又不得不做的事的时候。但是很神奇,伺候花草的时候,我会一下子陶醉其中,我对花草有种痴迷的喜爱。等生活无忧的时候我会去种花,种蘑菇,像苏秒一样陶醉在自己热爱的事情里。我最喜欢的就是里面苏秒和回味的感情了,她独立,她专注于自己的事情,她有自己的世界,她不患得患失,她活在当下,她也会考虑不太远的将来。心之所向,身之所往。看完了我感觉我会让自己向自己喜欢的那种生活方式再靠拢一些。

啰嗦完了开始写今天的博客设计模式之装饰器模式

设计模式是一种类层次或者结构的的设计方式,是一种解决问题的思维方式,没有固定的公式

装饰器模式比较好理解

#引入理解装饰器

小摊上卖手抓饼,烧饼,火烧一类的都选择性加 生菜,火腿,牛肉片,鸡蛋等

老板做好的一个饼热气腾腾的,不能直接拿给顾客,要问顾客的喜好,加不加其他的东西,顾客说加牛肉片,这时候旁边的老板娘在饼上加牛肉片,然后装入袋子中,然后收钱。

这里面刚刚做好的热气腾腾的烧饼或者手抓饼就是具体的构件,

加 生菜,火腿,牛肉片,鸡蛋等 放入包装袋 这就是装饰器。

#定义

抽象构件

具体构件

抽象装饰类

具体装饰类

#角色

装饰模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活

#装饰器模式的优点

1.装饰器类和被装饰器的类是独立的,你不需要懂我,我也不需要懂你,降低耦合度

2.装饰模式是继承模式的一个替代方案

#装饰器的缺点

1.会产生很多小对象

#装饰器的使用场景

1.想给一个类增加功能,但是又不想修改原来的代码,可以

2.类的核心功能不变,只是需要添加新的功能时候

#举个例子

#小摊上卖手抓饼和火烧,手抓饼5块一个,火烧6块一个,可以加辣椒酱,生菜,鸡蛋,牛肉片,火腿片

#辣椒酱免费,生菜多加1元,鸡蛋多加2元,牛肉片多加5元,火腿片多加4元

#顾客根据自己需要进行组合选择

class Bing:

name=''

price=0.0

def getPrice(self):

return self.price

def setPrice(self,price):

self.price=price

def getName(self):

return self.name

class HandHeldCake(Bing):

def __init__(self):

self.name='手抓饼'

self.price=5

class HuoShao(Bing):

def __init__(self):

self.name='火烧'

self.price=6

class decorator:

def getName(self):

pass

def getPrice(self):

pass

class spicyDecorator(decorator):

def __init__(self,decorator):

self.decorator=decorator

def getName(self):

return '+spicy'

def getPrice(self):

return 0

class vegatableDecorator(decorator):

def __init__(self,decorator):

self.decorator=decorator

def getName(self):

return '+生菜'

def getPrice(self):

return 1

class eggDecorator(decorator):

def __init__(self,decorator):

self.decorator=decorator

def getName(self):

return '+鸡蛋'

def getPrice(self):

return 2

class beefDecorator(decorator):

def __init__(self,decorator):

self.decorator=decorator

def getName(self):

return '+牛肉片'

def getPrice(self):

return 5

class peikonDecorator(decorator):

def __init__(self,decorator):

self.decorator=decorator

def getName(self):

return '+火腿片'

def getPrice(self):

return 4

if __name__=='__main__':

hs=HuoShao()

szb=HandHeldCake()

print(hs.getName(),hs.getPrice())

egg=eggDecorator(hs)

print(hs.getName(),egg.getName(),hs.getPrice()+egg.getPrice())

beef=beefDecorator(egg)

print(hs.getName(),egg.getName(),beef.getName(),hs.getPrice()+egg.getPrice()+beef.getPrice())

其他的想要啥自己加就可以了

参考

https://www.cnblogs.com/noteless/p/9603041.html

http://www.imooc.com/article/258816

还参考了其他博客,忘记添加链接了

python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern相关推荐

  1. python抽象工厂模式_Python设计模式之抽象工厂模式

    Python设计模式之抽象工厂模式 这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下 python面向对象编程入门,我们需要不断学习进步 "&qu ...

  2. python 装饰器 继承_Python设计模式之装饰器模式

    装饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) 使用组合 使用继承 注意,本文中的Decorat ...

  3. python装饰器带参数函数_python带参数装饰器的两种写法

    python带参数装饰器的两种写法 前言 最近在实现一个装饰器的过程中发现了一个很有意思的地方,在博客里面分享出来 不同的写法 三层函数嵌套,实现了可传参数的一个装饰器. import logging ...

  4. Java单体应用 - 架构模式 - 03.设计模式-10.装饰器模式

    原文地址:http://www.work100.net/training/monolithic-architecture-design-patterns-decorator-pattern.html ...

  5. python修饰器_python设计模式之修饰器模式

    python设计模式之修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. [ ] 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) [ ] 使用组合 ...

  6. python中command是什么意思_python 设计模式之命令(Command)模式

    #写在前面 也了解了不少设计模式了,他们都有一个通病,那就是喜欢把简单的东西复杂化.比如在不同的类中加个第三者.哈哈哈,简单变复杂是有目的的,那就是降低耦合度,增强可维护性,提高代码复用性,使代码变得 ...

  7. python中函数type可以测试对象类型_python类型检测最终指南--Typing模块的使用

    正文共:30429 字 预计阅读时间:76分钟 原文链接:https://realpython.com/python-type-checking/ 作者:Geir Arne Hjelle 译者:陈祥安 ...

  8. python中的数据成员有两类_Python类和对象

    一.概念 1.面向对象(Object Oriented,即OO),是一种设计思想. 2.面向对象编程(Object Oriented Programming,即OOP),可以使软件设计更加灵活,并且能 ...

  9. python中协程与函数的区别_python 协程与go协程的区别

    进程.线程和协程 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进 ...

最新文章

  1. C语言:随笔7--预处理命令
  2. [ay原创作品]用wpf写了个模仿36Kr网站登录背景的效果
  3. 详解Linux多线程编程
  4. numpy笔记 linalg
  5. [NOI2013]快餐店
  6. React单元测试:Jest + Enzyme(二)
  7. 单链表不带头标准c语言实现
  8. MS SQL 语法大全
  9. Mysql数据库常用分库和分表方式
  10. css为什么要用浮动_CSS中有几种定位?如何使用?
  11. 苹果开始尝试直接从自家零售店发货 更快送达消费者手中
  12. 如何将像素坐标转化为机械臂基座坐标_机械臂抓取自动精准标定
  13. $NOIp$前的日常
  14. Bailian2799 浮点数格式【文本处理+最值】
  15. 公司绝不会告诉你的20大秘密 转载
  16. RStudio的下载与安装
  17. 主板检测卡常见错误代码:0D~0F
  18. Windows 11 Insider Preview Build 25247.1000(rs_prerelease)更新内容
  19. python高德地图api调用实例_Python玩转高德地图API(二)
  20. 给定平面上的n个点,求最多有多少个点共线

热门文章

  1. android按钮旋转,单击一个按钮在android中顺时针旋转图像
  2. php excel header,【IT专家】PHP生成excel,方法一-header生成
  3. expressjs如何做mysql注入_Node.js+Express+Mysql 实现增删改查
  4. 如何重启_消费市场按下重启键,企业该如何提前布局
  5. hql实例 jpa_SpringBoot学习笔记九:Spring Data Jpa的使用
  6. html列表按时间排序代码_按字母顺序排序的列表
  7. java 品尝饮料,java细节经典题型
  8. linux错误码61,Linux编程中的错误码列表
  9. android两个java文件内容_java – 在1个请求中将多个文件从Android上传...
  10. strip string java_Java StringUtils.strip方法代码示例