文档章节

设计模式 Template模式

c
 caoxinyu0205
发布于 2016/09/03 11:33
字数 492
阅读 4
收藏 0

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

class P(object):
    def a():
        pass

    def b():
        pass

    def 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 = 0
    msg = ''
    domain = ''
    user_id = ''

    def set_domain(self, domain):
        self.domain = domain

    def set_user_id(self, user_id):
        self.user_id = user_id

    def validate_logic(self):
        return True

    def validate(self):
        if self.validate_logic():     # subclass validation is OK, run the basic validation for format
            if 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 False
            return True
        return 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 = 1
            self.msg = u'此账号不存在'
            return False
        return True

© 著作权归作者所有

共有 人打赏支持
c
粉丝 0
博文 35
码字总数 16920
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

关于360插件化Replugin Activity动态修改父类的字节码操作

近期在接入360插件化方案Replugin时,发现出现崩溃情况。 大概崩溃内容如下: aused by: java.lang.ClassNotFoundException: Didn't find class "x.x.x.xActivity" on path: 我自己在插件代码......

Gemini-Lin
今天
0
0
mybatis缓存的装饰器模式

一般在开发生产中,对于新需求的实现,我们一般会有两种方式来处理,一种是直接修改已有组件的代码,另一种是使用继承方式。第一种显然会破坏已有组件的稳定性。第二种,会导致大量子类的出现...

算法之名
昨天
18
0
单元测试

右键方法 Go To --> Test,简便快速生成测试方法。 相关注解 @RunWith(SpringRunner.class) 表示要在测试环境中跑,底层实现是 jUnit测试工具。 @SpringBootTest 表示启动整个 Spring工程 @A...

imbiao
昨天
4
0
欧拉公式

欧拉公式表达式 欧拉公式的几何意 cosθ + j sinθ 是个复数,实数部分也就是实部为 cosθ ,虚数部分也就是虚部为 j sinθ ,对应复平面单位圆上的一个点。 根据欧拉公式和这个点可以用 复指...

sharelocked
昨天
5
0
burpsuite无法抓取https数据包

1.将浏览器和burpsuite的代理都设置好 2.在浏览器地址栏输入: http://burp 3.下载下面的证书,并将证书导入浏览器 cacert.der

Frost729
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部