博客
关于我
设计模式-结构型-组合模式
阅读量:186 次
发布时间:2019-02-28

本文共 1558 字,大约阅读时间需要 5 分钟。

文章目录

组合模式

概述

  • 将对象组合成树形结构以表示“部分和整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性

对象

  • 抽象组件(Component)
  • 叶子组件(Leaf)
  • 复合组件(Composite)
  • 客户端(Client)

适用场景

  • 表示对象的“部分与整体”层次结构
  • 希望用户忽略组合对象与单个对象的不同,用户统一的使用组合结构中的所有对象

例子

# 假设存在多个图形,并且可以通过基本图形组合成复合图形from abc import ABCMeta, abstractmethod# 抽象组件class Graphic(metaclass=ABCMeta):        @abstractmethod    def draw(self):        pass#叶子组件class Point(Graphic):    def __init__(self, x, y):        self.x = x        self.y = y        def __str__(self):        return f"Point({self.x}, {self.y})"    def draw(self):        print(str(self))class Line(Graphic):    def __init__(self, p1, p2):        self.p1 = p1        self.p2 = p2        def __str__(self):        return f"Line[{self.p1}, {self.p2}]"        def draw(self):        print(str(self))# 复合组件class Picture(Graphic):    def __init__(self, iterable):        self.children = []        for i in iterable:            self.add(i)        def add(self, grophic):        self.children.append(grophic)        def draw(self):        print("---复合图形---")        for i in self.children:            i.draw()        print("---复合图形---")print("-----------pic1-------------------")p1 = Point(2,3)l1 = Line(Point(3,4), Point(6,7))l2 = Line(Point(3,5), Point(6,8))pic1 = Picture([p1, l1, l2])pic1.draw()print("-----------pic2-------------------")p2 = Point(3,3)l3 = Line(Point(4,4), Point(7,7))l4 = Line(Point(5,5), Point(8,8))pic2 = Picture([p2, l3, l4])pic2.draw()print("-----------pic-------------------")pic = Picture([pic1, pic2])pic.draw()

优点

  • 定义了包含基本对象和组合对象的层次结构
  • 简化了客户端代码,客户端可以一致的使用组合对象和单个对象
  • 更容易增加新类型组件

转载地址:http://duec.baihongyu.com/

你可能感兴趣的文章
Mysql报错Packet for query is too large问题解决
查看>>
mysql报错级别_更改MySQL日志错误级别记录非法登陆(Access denied)
查看>>
Mysql报错:too many connections
查看>>
MySQL报错:无法启动MySQL服务
查看>>
mysql授权用户,创建用户名密码,授权单个数据库,授权多个数据库
查看>>
mysql排序查询
查看>>
MySQL排序的艺术:你真的懂 Order By吗?
查看>>
MySQL排序的艺术:你真的懂 Order By吗?
查看>>
Mysql推荐书籍
查看>>
Mysql插入数据从指定选项中随机选择、插入时间从指定范围随机生成、Navicat使用存储过程模拟插入测试数据
查看>>
MYSQL搜索引擎
查看>>
mysql操作数据表的命令_MySQL数据表操作命令
查看>>
mysql操作日志记录查询_如何使用SpringBoot AOP 记录操作日志、异常日志?
查看>>
MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
查看>>
mysql支持表情
查看>>
MySQL支撑百万级流量高并发的网站部署详解
查看>>
MySQL改动rootpassword的多种方法
查看>>
mysql数据分组索引_MYSQL之索引配置方法分类
查看>>
mysql数据取差,mysql屏蔽主外键关联关系
查看>>
MySQL数据和Redis缓存一致性方案详解
查看>>