Django设计模式
单例模式:
建造者模式:
示例:
- from enum import Enum
- import time
- PizzaProgress = Enum('PizzaProgress', 'queued preparation baking ready')
- PizzaDough = Enum('PizzaDough', 'thin thick')
- PizzaSauce = Enum('PizzaSauce', 'tomato creme_fraiche')
- PizzaTopping = Enum('PizzaTopping', 'mozzarella double_mozzarella bacon ham mushrooms red_onion oregano')
- STEP_DELAY = 3
- class Pizza:
- def __init__(self, name):
- self.name = name
- self.dough = None
- self.sauce = None
- self.topping = []
- def __str__(self):
- return self.name
- def prepare_dough(self, dough):
- self.dough = dough
- print('preparing the {} dough of your {}....'.format(self.dough.name, self))
- time.sleep(STEP_DELAY)
- print('done with the {} dough'.format(self.dough.name))
- class MargaritaBuilder:
- def __init__(self):
- self.pizza = Pizza('margarita')
- self.progress = PizzaProgress.queued
- self.baking_time = 5
- def prepare_dough(self):
- self.progress = PizzaProgress.preparation
- self.pizza.prepare_dough(PizzaDough.thin)
- def add_sauce(self):
- print('adding the tomato sauce to your margarita....')
- self.pizza.sauce = PizzaSauce.tomato
- time.sleep(STEP_DELAY)
- print('done with the tomato sauce')
- def add_topping(self):
- print('adding the topping (double mozzarella,oregano) to your margarita')
- self.pizza.topping.append([i for i in (PizzaTopping.double_mozzarella, PizzaTopping.oregano)])
- time.sleep(STEP_DELAY)
- print('done with the topping (double mozzarella, oregano)')
- def bake(self):
- self.progress = PizzaProgress.baking
- print('baking your margarita for {} seconds'.format(self.baking_time))
- time.sleep(self.baking_time)
- self.progress = PizzaProgress.ready
- print('your margarita is ready')
- class CreamyBaconBuilder:
- def __init__(self):
- self.pizza = Pizza('creamy bacon')
- self.progress = PizzaProgress.queued
- self.baking_time = 7
- def prepare_dough(self):
- self.progress = PizzaProgress.preparation
- self.pizza.prepare_dough(PizzaDough.thick)
- def add_sauce(self):
- print('adding the creme fraiche sauce to your creamy bacon')
- self.pizza.sauce = PizzaSauce.creme_fraiche
- time.sleep(STEP_DELAY)
- print('done with the creme fraiche sauce')
- def add_topping(self):
- print('adding the topping (mozzarella, bacon, ham, mushrooms,red onion, oregano) to your creamy bacon')
- self.pizza.topping.append([t for t in (
- PizzaTopping.mozzarella, PizzaTopping.bacon, PizzaTopping.ham, PizzaTopping.mushrooms,
- PizzaTopping.red_onion,
- PizzaTopping.oregano)])
- time.sleep(STEP_DELAY)
- print('done with the topping (mozzarella, bacon, ham,mushrooms, red onion, oregano)')
- def bake(self):
- self.progress = PizzaProgress.baking
- print('baking your creamy bacon for {} seconds'.format(self.baking_time))
- time.sleep(self.baking_time)
- self.progress = PizzaProgress.ready
- print('your creamy bacon is ready')
- class Waiter:
- def __init__(self):
- self.builder = None
- def construct_pizza(self, builder):
- self.builder = builder
- [step() for step in (builder.prepare_dough, builder.add_sauce, builder.add_topping, builder.bake)]
- @property
- def pizza(self):
- return self.builder.pizza
- def validate_style(builders):
- try:
- pizza_style = input('what pizza would you like, [m]argarita or [c]reamy bacon?')
- builder = builders[pizza_style]()
- valid_input = True
- except KeyError as err:
- print('Sorry, only margarita (key m) and creamy bacon (key c) are available')
- return (False, None)
- return (True, builder)
- def main():
- builders = dict(m=MargaritaBuilder, c=CreamyBaconBuilder)
- valid_input = False
- while not valid_input:
- valid_input, builder = validate_style(builders)
- print()
- waiter = Waiter()
- # waiter.construct_pizza(builder)
- waiter.construct_pizza(builder)
- pizza = waiter.pizza
- print()
- print('Enjoy your {}!'.format(pizza))
- if __name__ == '__main__':
- main()
- 结果一:
- what pizza would you like, [m]argarita or [c]reamy bacon?c
- preparing the thick dough of your creamy bacon....
- done with the thick dough
- adding the creme fraiche sauce to your creamy bacon
- done with the creme fraiche sauce
- adding the topping (mozzarella, bacon, ham, mushrooms,red onion, oregano) to your creamy bacon
- done with the topping (mozzarella, bacon, ham,mushrooms, red onion, oregano)
- baking your creamy bacon for 7 seconds
- your creamy bacon is ready
- Enjoy your creamy bacon!
- 结果二:
- what pizza would you like, [m]argarita or [c]reamy bacon?m
- preparing the thin dough of your margarita....
- done with the thin dough
- adding the tomato sauce to your margarita....
- done with the tomato sauce
- adding the topping (double mozzarella,oregano) to your margarita
- done with the topping (double mozzarella, oregano)
- baking your margarita for 5 seconds
- your margarita is ready
- Enjoy your margarita!
建造pizza示例
Django设计模式的更多相关文章
- 6.-Django设计模式及模版层
一.MVC (java等其他语言) MVC代表Model-view-Contorller(模型-视图-控制器)模式 M模型层主要用于对数据库层的封装 V视图层用于向用户展示结果 C控制器用于处理请求. ...
- Django 学习笔记(一) --- Hello Django
人生苦短 ~ Tips:仅适用于 Python 3+(反正差别不大,py2 改改也能用).因为据 Python 之父 Guido van Rossum 说会在 2020 年停止对 Python 2 的 ...
- Django简介(MVC、MTV)
Django简介 MVC Model(模型)- 应用程序中处理数据逻辑部分且与数据库交互,用于存取数据的部分 View(视图)- 用于处理后的数据界面展示,且视图通常是由模型数据创建的,是用户看到并与 ...
- django 的基础设计
一.web程序工作流程 二.django 的基础介绍 目的:了解Django框架的作用和特点 作用: 简便.快速的开发数据库驱动的网站 Django的优势 快速开发 MVT 功能齐全 Django学 ...
- django基础回顾
1,web项目工作流程 1.1 了解web程序工作流程 1.2 django生命周期2,django介绍 目的:了解Django框架的作用和特点 作用: 简便.快速的开发数据库驱动的网站 Django ...
- django基本内容
1,流程 1.1 了解web程序工作流程 1.2 django生命周期 2,django介绍 目的:了解Django框架的作用和特点 作用: 简便.快速的开发数据库驱动的网站 django的优 ...
- day1(Django)
1,web项目工作流程 1.1 了解web程序工作流程 1.2 django生命周期 2,django介绍 目的:了解Django框架的作用和特点作用: 简便.快速的开发数据库驱动的网站 Djan ...
- Python资源大全
The Python Tutorial (Python 2.7.11) 的中文翻译版本.Python Tutorial 为初学 Python 必备官方教程,本教程适用于 Python 2.7.X 系列 ...
- 如何系统地自学 Python?
最近开始系统的学习Python,以及整理的一些资料.github记录着个人自学 Python 的过程,持续更新.欢迎大家一起来完善这个自学Python学习的项目,给后来者一个参考的学习过程.githu ...
随机推荐
- word2vec模型评估方案
1.word2vec参数详解 · sentences:可以是一个·ist,对于大语料集,建议使用BrownCorpus,Text8Corpus或·ineSentence构建.· sg: 用于设置训练算 ...
- NO Route to Host 连接mysql数据库
显然是请求被服务器的防火墙给拦截了 1,vi /etc/sysconfig/iptables 2,在倒数第三行以前添加 -A INPUT -p tcp -m state --state NEW -m ...
- 如何用Win7远程链接ubuntu14.04桌面
如何用Win7远程链接ubuntu14.04桌面 采用vnc技术 参考:http://blog.csdn.net/hnjztyx/article/details/69739137
- 如何比sketch和axure更方便地给原型做交互?
在快速的工作环境中,我们现在都希望在工作的各个环节中提高效率.有些产品设计师们做产品原型时,会感觉sketch或者axure添加交互的方式不够快捷.下面就提供一种解决方案. 使用工具:墨刀. 交互链接 ...
- js动态规划---背包问题
//每种物品仅有一件,可以选择放或不放 //即f[i][w]表示前i件物品恰放入一个容量为w的背包可以获得的最大价值. //则其状态转移方程便是:f[i][w]=max{f[i-1][w],f[i-1 ...
- 机器学习算法的调试---梯度检验(Gradient Checking)
梯度检验是一种对求导结果进行数值检验的方法,该方法可以验证求导代码是否正确. 1. 数学原理 考虑我们想要最小化以 θ 为自变量的目标函数 J(θ)(θ 可以为标量和可以为矢量,在 Numpy 的 ...
- [洛谷]p1996约瑟夫环 &xdoj1311
https://www.luogu.org/problemnew/show/P1996 约瑟夫环这个问题一直以来都是用循环链表写的,今天才知道有循环队列的写法.以下是要点: 1.循环队列实现环的思想, ...
- shell基础:多命令顺序执行与管道符
有些命令的前后关系正是需要这样的关系来实现. 如在软件包的安装中: 第三个是个简单的判断:
- mint-ui Picker的使用
<template> <div v-bind:style="{minHeight:clientHeight + 'px'}" id="recive-mi ...
- NetSpeed
NetSpeed公司提供的NOC包括三部分,可以通过NocStudio进行配置生成. 1)NetSpeed Orion,面向快速SoC design的可综合平台. 2)Linley NetSpeed ...