专栏首页大猪的笔记python:组合模式

python:组合模式

原理

组合模式是一种抽象。将整体和部分统一对待。 比如一个网页。它可以显示一条新闻,N条新闻,它的操作“显示”对于一条新闻和N条新闻的动作是一致的。“N条新闻”是“一条新闻”的组合。它们都有相同的方法“显示”。 由部分“组合”成整体,加大了代码复用的灵活性。

实现

下面实现一个内容模版。比如一个网页的内容,可以由不同的元素组合。

定义接口

import abc
import random
# 组合模式
class IJsonTemplateDataTree(object):
    # 定义一个接口
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def add(self, component):
        pass

    @abc.abstractmethod
    def to_json(self):
        pass

定义组件类

组件类是一个List。它实现组件的接口。调用组件的add方法可以把叶子添加到组件中。多个组件也能组合成一个大的组件。

class JsonTemplateDataConponent(IJsonTemplateDataTree):
    def __init__(self, tp_name):
        self.comp_list = []
        self.data = []

    def add(self, component):
        self.comp_list.append(component)

    def to_json(self):
        self.data = []
        for item in self.comp_list:
            self.data.append(item.to_json())
        return self.data

值得注意的是,组件只提供“组合”的功能。它的to_json方法,是循环调用的叶子(或子组件)的方法。功能的实现最终下沉到叶子。

叶子节点

组件组合叶子节点,具体的实现由叶子节点控制。在这定义了两个不同的叶子类型(article, gif),它们产生不同的数据。

class JsonTemplateArticleLeaf(IJsonTemplateDataTree):
    def __init__(self, tp_type, db_type, sub_cate, count):
        self.tp_type = tp_type
        self.db_type = db_type
        self.sub_cate = sub_cate
        self.count = count

    def add(self):
        pass

    def to_json(self):
        # 拼点假的数据,实际操作将很复杂
        data = []
        for i in range(0, self.count):
            data.append({
            'types': self.tp_type,
            'data':{
                'ID': random.randint(0,999),
                'Title': 'a article',
                'Category': self.sub_cate
            }
        })
        return data


class JsonTemplateGifLeaf(IJsonTemplateDataTree):
    def __init__(self, tp_type, db_type, sub_cate, count):
        self.tp_type = tp_type
        self.db_type = db_type
        self.sub_cate = sub_cate
        self.count = count

    def add(self):
        pass

    def to_json(self):
        # 拼点假的数据,实际操作将很复杂
        data = []
        for i in range(0, self.count):
            data.append({
            'types': self.tp_type,
            'data':{
                'ID': random.randint(0,999),
                'Title': 'a gif',
                'Category': self.sub_cate
            }
        })
        return data

调用组件

tp_list = JsonTemplateDataCompent('') # 创建一个组件
tp_list.add(JsonTemplateArticleLeaf('article', 'article', 'lishi', 2))  # 创建一个article叶节点,并添加到组件
tp_list.add(JsonTemplateGifLeaf('img', 'gif', 6, 3))  # 创建一个gif节点,并添加到组件

print(tp_list.to_json()) # 调用组件的to_json方法。它会循环调用所有叶节点的方法。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python笔记:迭代器

    1 原理 指实现系统的迭代接口,这样,我们自己的对象也能使用系统的 for in 来进行迭代循环,是不是很酷! 在每次迭代之时,类的内部状态都发生了变化,所以我...

    超级大猪
  • python笔记:随机数,md5,en/decoder

    超级大猪
  • python笔记:面向对象

    1 封装与断言 在Python中,用类封装概念十分简单,下面是一个类的使用。所有的类都继承自object。在类的成员函数中,第一个参数必须是self,否则,这个...

    超级大猪
  • python 搭建简单的http ser

    py3study
  • Mechanize实战二:获取音悦台公告

    有些网站或论坛为了防止暴力破解,在登录框设置了一个验证码,目前针对验证码的解决方案可谓是千奇百怪,考虑到爬虫所需要的只是数据,完全可以绕过验证码,直接使用COO...

    py3study
  • python pyqt5 QFileDialog 常用

    getOpenFileName() getSaveFileName() setFileMode() setFilter()

    用户5760343
  • Python GUI项目实战(二)主窗体的界面设计与实现

    上一节我们介绍了登录窗体的GUI设计与功能实现,用户的账号和密码校验完成后应当跳转到主窗体内容,这一节我们将具体介绍主窗体界面的设计与功能实现!

    小雨编程
  • 反运算(简单的定制)[第十七章]

    关于反运算,这里要注意一点;对于a + b,b的__radd__(self,other),中other是a的对象,self才是b的对象

    天钧
  • django设置全文搜索引擎

    自己的网站一般都采用直接数据库搜索的方式,一直表现良好(数据量小)。直到某一天我将搜索词从“被掩埋的巨人”变成了“被掩埋 巨人”(中间有空格),数据库返回零。

    羽翰尘
  • 我的小工具-远程读卡器web客户端(nodejs+websocket实现实时指令交互)

    之前的小工具,远程读卡器web客户端,实现原理是把读写卡服务装在远程(现场)的电脑上,这样有一些缺点,比如现场电脑必须开启端口映射,让客户端能否访问到。只能写好...

    特立独行的猫a

扫码关注云+社区

领取腾讯云代金券