Python的创建型设计模式之建造者模式

书上说此模式和前面的抽象工厂模式相似,它不仅提供了创建复杂对象所需的方法,而且还保存了对象里各部分的细节。

个人觉得,抽象工厂里面因为包含了类中嵌套类的模式,就没有那么像父子类的模式,在看了建造者模式之后,觉得这个才真的很类似于父子类的模式。

再借用书上的话:尤其适用于需要把复杂对象各部分的细节与其创建流程相分离的场合。

现在是要用HTML和TKinter完成一个表单的创建,来看看部分事例代码:

1.首先是一个只能用作抽象基类的类,里面包括了添加表单,标题,内容等等方法

class AbstractFormBuilder(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def add_title(self, title):
        pass

    @abc.abstractmethod
    def form(self):
        pass

    @abc.abstractmethod
    def add_label(self, text, row, column, **kwargs):
        pass
	
    ...
2.html下完成表单的类,在继承AbstractFormBuilder的基础上完成具体方法

class HtmlFormBuilder(AbstractFormBuilder):

    def __init__(self):
        self.title = "HtmlFormBuilder"
        self.items = {}

    def add_title(self, title):
        pass

    def add_label(self, text, row, column, **kwargs):
        self.items[(row, column)] = ('<td><label for="{}":</label></td>')\
            .format(kwargs["target"], xml.sax.saxutils.escape(text))

    def form(self):
        html = ["<!doctype html>\n<html><head><title>{}</title></head>"
                "body".format(self.title), '<form><table border="0">']
        thisRow = None
        for key, value in sorted(self.items.items()):
            row, column = key
            if thisRow is None:
                html.append("  <tr>")
            elif thisRow != row:
                html.append("  </tr>\n <tr>")
                thisRow = row
                html.append("  " + value)
            html.append("</tr>")
            return "\n".join(html)
    ...

3.tkinter下完成表单的类

class TkFormBuilder(AbstractFormBuilder):

    def __init__(self):
        self.title = "TkFormHtml"
        self.statements = []

    def add_title(self, title):
        pass

    def add_label(self, text, row, column, **kwargs):
        name = self._canonicalize(text)
        create = """self.{}Label = ttk.Label(self, text="{}:")""".format(name, text)
        layout = """self.{}Label.grid(row={}, column={}, sticky=tk.W)""".format(name, row, column)
        self.statements.append((create, layout))

    TEMPLATE = """创建表单的代码,使用到了tkinter"""

    def form(self):
        return TkFormBuilder.TEMPLATE.format(title=self.title,
                                             name=self._canonicalize(self.title, False),
                                             statements="\n     ".join(self.statements))

    def _canonicalize(self, text, startLower=True):
        text = re.sub(r"\W", "", text)
        if text[0].isdigit():
            return "_" + text
        return text if not startLower else text[0].lower() + text[1:]

盖楼房,也就是这个道理吧。有根基和大致布局,才能去具体完成。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值