文档章节

设计模式 Template模式

神之道道
 神之道道
发布于 2016/04/08 15:51
字数 477
阅读 1
收藏 0

在面向对象系统的分析与设计过程中经常会遇到这样一种情况: 一个流程可以分为A,B,C….多个步骤,但在具体的步骤中可能会有不同的情况出现,这时就Template模式就非常有用:

class P(object):def a():passdef b():passdef operate():a()
        b()class Sub(P):def a():print 'a in sub'def b():print 'b in sub'class Suba(P):def a():print 'a in suba'def b():print 'b in suba'

也就是说在父类中定义流程的细节,步骤的接口,在子类中无需管流程的细节,只要实现步骤的细节即可以满足功能的需求了。

最近做的一个Flask项目就用到了Template模式,在route中接受到的post请求需要验证,而wtf已经提供了一些基本格式的验证,这时想把一些功能上的验证也做到里面去,不讨论这么做是不是符合面向对象的一些原则,在这个项目中很方便也不会有问题就好!于是新建了一个类:

class AgentForm(Form):status = 0msg = ''domain = ''user_id = ''def set_domain(self, domain):self.domain = domaindef set_user_id(self, user_id):self.user_id = user_iddef validate_logic(self):return Truedef validate(self):if self.validate_logic():     # subclass validation is OK, run the basic validation for formatif not super(AgentForm, self).validate():
                self.status = FORMAT_VALIDATION_FAILED_RET
                errors = deepcopy(self.errors)if 'csrf_token' in errors:del errors['csrf_token']for value in errors.itervalues():
                    self.msg += string.join(value, sep=' ')
                    self.msg += '\n'self.msg = self.msg[0:len(self.msg)-1]# self.msg = str(self.errors)return Falsereturn Truereturn False

这个类的目的在于将wtf本身的验证信息返回到成员变量status,msg里面来,方便调用者获取。同时提供validate_logic函数接口,子类只需要重载validate_logic函数,并在出现错误时为status,msg赋值即可。子类示例:

class ForgetPwdForm(AgentForm):email = StringField('email', validators=[
        DataRequired(message=u'请填写者电子邮件'),
        Email(message=u'Email格式不正确')
    ])def validate_logic(self):user = User.query.filter_by(email=self.email.data, domain=self.domain).first()if not user:
            self.status = 1self.msg = u'此账号不存在'return Falsereturn True

© 著作权归作者所有

共有 人打赏支持
神之道道
粉丝 0
博文 12
码字总数 3929
作品 0
深圳
私信 提问
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
0
0
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
0
0
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式笔录(二),设计模式有哪些

本人出道5年,学习、编程、再学习、再编程一路走过,只是在笔和纸留下些脚印,实感惭愧。现开始把自己学习到的心得,实践中的体会,一一贴在互联网上,大家互相学习、探讨,寻找一些技术朋友...

方旭
2011/03/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java12的新特性

Java语言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 Java13的新特性 序 本文主要讲述一下Java12的新特...

go4it
11分钟前
1
0
深入解密比Guava Cache更优秀的缓存-Caffeine

1.前言 读这篇文章之前希望你能好好的阅读: 你应该知道的缓存进化史 和 如何优雅的设计和使用缓存? 。这两篇文章主要从一些实战上面去介绍如何去使用缓存。在这两篇文章中我都比较推荐Caffe...

咖啡拿铁的技术分享
13分钟前
1
0
Java B2B2C多用户商城 springcloud架构 --Eureka服务器搭建及配置

第一步,创建一个普通的springboot项目 以下方法都可以快速创建一个boot项目: 1. 浏览器访问http://start.spring.io/,填写信息,下载zip包,加压到你的ide的工作空间直接使用。 2. 使用ide...

明理萝
25分钟前
0
1
为什么阿里巴巴禁止在 foreach 循环里进行元素的 remove/add 操作

· Oracle 撒手,宣布对个人用户 (Personal Users) , Java 8 官方支持时间持续到 2020 年 12 月;对商业用户(Commercial Users),2019 年 1 月之后不再提供免费更新。 · 红帽喊话,计划在...

Java填坑路
27分钟前
0
0
在 Ali Kubernetes 系统中,我们这样实践混沌工程

在传统的软件测试中,我们通常通过一个给定的条件来判断系统的反馈,通过断言来判断是否符合预期,测试条件和结果通常比较明确和固定。而混沌工程,是通过注入一些“不确定”因素,象放进了一...

阿里云官方博客
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部