设计模式 Template模式

在面向对象系统的分析与设计过程中经常会遇到这样一种情况: 一个流程可以分为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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章