python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

#写在前面

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

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

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

装饰器模式比较好理解

#引入理解装饰器

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

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

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

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

#定义

抽象构件

具体构件

抽象装饰类

具体装饰类

#角色

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

#装饰器模式的优点

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())

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

1303036-20190813173602432-1993833940.png

参考

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cmd如何默认以管理身份运行

一,cmd如何默认以管理身份运行 1,是不是每次打开cmd窗口都是这样的 这代表默认情况下不是以管理员身份运行的,而是用户身份。 博主是个很懒的人,从来都会想办法以最简单有效的方法处理,不想每次通过win键加r输入cmd&…

cmd中输入net start mysql 提示:服务名无效

cmd中输入net start mysql 提示:服务名无效 1,首先你需要找到下图,看你要启动的的mysql是不是叫mysql还是叫目前最新版本的mysql80 怎么找下面这张图呢?路径是:右键“我的电脑”,点击管理,点击…

net start mysql 发生系统错误 5。 拒绝访问。的解决方法

net start mysql 发生系统错误 5。 拒绝访问。的解决方法 发生的问题,由于默认情况下cmd是以用户身份运行的,出现此类问题是由于没有权限。运行cmd时需要以管理员身份运行 以管理员身份运行后再输入命令net start mysql80即可 那么如何设置默认情况下以…

npm的常用使用技巧

npm是一个强大的工具&#xff0c;可以帮助你管理Node.js项目中的依赖项。以下是一些有用的npm使用技巧&#xff1a; 使用npm install命令&#xff1a;这个命令可以安装项目的依赖项。如果你想安装一个特定的版本&#xff0c;你可以使用npm install <package><version…

如何设置MySQL的环境变量

如何设置MySQL的环境变量 1&#xff0c;右击“我的电脑”&#xff0c;点击属性&#xff0c;点击高级系统设置&#xff0c;点击环境变量。 2&#xff0c;在系统变量栏&#xff0c;找到Path&#xff0c;双击&#xff0c;点击新建&#xff0c; 内容为你的mysql中bin目录的路径&a…

MySQL启动、连接,退出,关闭命令学习

MySQL启动、连接&#xff0c;退出&#xff0c;关闭命令学习 1&#xff0c;启动MySQL服务 net start mysql80 2&#xff0c;连接MySQL mysql -h127.0.0.1 -u用户名 -p密码 回车&#xff0c;出现下面一堆东西就说明是好的。 说明: -h: 主机名&#xff0c;表示要连接的数据库…

coordinatorlayout_一篇文章学会Coordinatorlayout+AppbarLayout

点击上方蓝字关注 ??来源&#xff1a; 奔跑吧李博https://www.jianshu.com/p/cd93da2b7a24前言现如今&#xff0c;折叠式布局在App中相当常见&#xff0c;给人一种科技感&#xff0c;充满良好的用户体验。CoordinatorlayoutAppbarLayoutCollapsingToolbarLayout这三个臭皮匠…

一行python代码值多少钱_一行python代码

Life is short, just use Python. 自从08年接触Python&#xff0c;就有爱不释手的感觉&#xff0c;逐渐地&#xff0c;有些不忍地疏远了Perl 和Shell编程&#xff0c;因为python 的优雅么&#xff1f; 不全是&#xff0c;主要是可以高效开发吧。 那一行代码可以干什么呢&#x…

数据库MySQL相关操作||创建数据库、显示所有数据库、切换数据库、显示数据库下的数据库表、删除数据库

数据库MySQL相关操作||创建数据库、显示所有数据库、切换数据库、显示数据库下的数据库表、删除数据库 1&#xff0c;创建数据库 create databases mydb&#xff1b; 记得加&#xff1b;&#xff08;分号&#xff09; 2&#xff0c;显示所有数据库 show databases; 3&…

在yuv域如何降低画面亮度_家庭影院投影机错误地调节了亮度和对比度会得到怎么样的画面?...

家有影院&#xff0c;可以跟据你的房间和使用习惯设计家庭影院方案&#xff0c;并且还能让你以最优惠的价格买到它们。总之&#xff0c;一切关于家庭影院的问题&#xff0c;我们都可以帮你搞定。解决问题的方式从一对一咨询开始&#xff0c;如有需要&#xff0c;添加家有影院设…

MySQL创建数据库表student

MySQL创建数据库表student 1&#xff0c;创建数据库 create database mydb&#xff1b; 2&#xff0c;查看所有数据库 show databases; 3&#xff0c;使用数据库 use mydb; 4&#xff0c;创建数据库表student create table student(sno int(6),name varchar(12),sex char(2)…

java遍历数组练习(for循环、foreach)

java遍历数组练习&#xff08;for循环、foreach&#xff09; /* * 遍历数组 for循环 foreach * */ public class Test01 {public static void main(String[] args) {int[] arr {11,3,45,6,78,89,23,4};//for循环遍历数组for (int index 0;index<arr.length;index){Sys…

mybatis generator 打印出来表了 但是没有生成未见_Python丨深度学习中使用生成器加速数据读取与训练...

1、什么是生成器我们可以把生成器理解为一个高端的列表。生成器就是一个集算法和列表还有依次读取于一体的功能。因为如果列表存储的内容过多就会造成内存的浪费。但是如果“列表”内的元素可以通过某种规则展示出来、且我们只需要前几项的元素&#xff0c;我们就可以通过使用生…

从键盘上录入10科考试分数,输出最高分最高分输入的序号

从键盘上录入10科考试分数&#xff0c;输出最高分最高分输入的序号 import java.util.Scanner;/* * 从键盘上录入10科考试分数&#xff0c;输出最高分最高分输入的序号 * */ public class Test02 {public static void main(String[] args) {Scanner sc new Scanner(System.in…

pycharm项目目录结构_「Actix-web项目」-项目整体目录结构

前言完成一个前后端分离项目&#xff0c;后端技术选型Rust的框架Actix-web&#xff0c;那么用这个框架完成后端代码它的项目目录很重要&#xff0c;今天就来着重介绍一下。目录结构下面是自己用Rust Actix-web框架写web后端的目录结构&#xff0c;如图所示&#xff1a;目录结构…

java查询数组中元素的索引

java查询数组中元素的索引 /*** java查询数组中元素的索引*/ public class Test03 {public static void main(String[] args) {int[] arr {5,7,4,9,5,7,2,8,1,5,0};//查询元素 2 的索引int value 2;//准备一个变量用于存储目标元素的索引int index -1;//查找元素在数组中第…

完善三个数字对象排序程序。MOOC,Java第四章 面向对象和类 第一次作业

题目内容&#xff1a; 完善以下程序&#xff0c;利用swap函数&#xff0c;完成数字按从小到大的顺序输出。例如输入5 4 3 输出3,4,5。 输入格式: 输入3个数字。 输出格式&#xff1a; 数字从小到大排列 输入样例&#xff1a; 5 4 3 输出样例&#xff1a; 3,4,5 代码…

触发器及其应用实验报告总结_双面喷绘材料的分类及其应用,超全总结!(建议收藏)...

▲ 东川 | 点击图片获取更多信息▲ 东川 | 点击图片获取更多信息双面喷绘材料&#xff0c;有适合水性机器喷的双面摭光画布&#xff0c;有适合弱溶剂和UV喷绘的PVC双喷、PET双喷、双喷网格布、双面牛筋布&#xff0c;它们有个共同的特点就是&#xff0c;即可以单面打画面&#…

java实现程序输出以下5*5数字方格

请实现程序输出以下5*5数字方格。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 需要在main函数的输入参数中设置5&#xff0c;输出5*5的数字方格。如果是输入7&#xff0c;则是7*7的数字方格。 代码如下&#xff1…

java请实现程序输出以下星塔||输出菱形

java请实现程序输出以下星塔||输出菱形 请实现程序输出以下星塔。 * *** ***** *** * 需要在main函数的输入参数中设置5&#xff0c;输出5层星塔。如果是输入7&#xff0c;则是7层星塔。假设输入参数都是奇数&#xff0c;且都大于等于5&#xff0c;小于等于11。 第一种写法&a…