前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python:组合模式

python:组合模式

作者头像
超级大猪
发布2019-11-21 20:32:44
3990
发布2019-11-21 20:32:44
举报
文章被收录于专栏:大猪的笔记

原理

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

实现

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

定义接口

代码语言:javascript
复制
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方法可以把叶子添加到组件中。多个组件也能组合成一个大的组件。

代码语言:javascript
复制
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),它们产生不同的数据。

代码语言:javascript
复制
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

调用组件

代码语言:javascript
复制
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方法。它会循环调用所有叶节点的方法。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-12-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原理
  • 实现
    • 定义接口
      • 定义组件类
      • 叶子节点
      • 调用组件
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档