介绍享元模式(Flyweight),运行共享技术有效地支持大量细粒度的对象,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类)。

如果以绘图为例的话,一个文字是一个绘图元件,一个线段是一个绘图元件,而一个长方形也是一个绘图元件,这些绘图元件可以组成一个图片,如果将这个图片也 视作一个绘图元件,则这么递回绘图下去,就可以组合成一个较大的、复杂的图形元件,这样的目的可以使用Composite模式来解决。

对于使用者而言,无论是文字、线段或长方形,甚至是组合后的图片元件,它们都拥有一个共同的行为,使用者基本上并不会感觉出它们之间的操作有任何的不同,您可以拖曳、放大、缩小等等,这些行为都是一致的。

以 UML 来表示上面这个例子的结构: 
对于Text、Line与Rectangle而言,Picture是一个容器,然而Picture继承Graphic类,所以它也是一个绘图元件,您可以进一步的将Picture组合至另一个Picture中,以形成较大的、复杂的图形。

组合模式的UML结构图如下所示: 
依此架构,您可以递回的组合图形元件,例如:
除了绘图元件之外,一些具有层次性或组合性的物件也可以使用Composite模式,像是电路元件、设备元件等等,使用Composite模式可以大大减低这些元件设计的复杂度。

转载于:https://www.cnblogs.com/xiari/p/3376244.html

享元模式 Composite相关推荐

  1. 6中结构型设计模式的对比理解(Composite组合模式,Proxy代理模式,Flyweight享元模式,Facade门面模式,Bridge桥接模式,Decorator装饰器模式)

    结构型模式 结构型模式用来组装 类和对象,以获得更大的结构. 结构型类模式,通过继承机制来组合接口或类.简单的例子就是多重继承,最后一个类拥有所有父类的性质.这个模式有助于独立开发一个协同类.另一个例 ...

  2. 设计模式之享元模式(Flyweight)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  3. 享元模式 FlyWeight 结构型 设计模式(十五)

    享元模式(FlyWeight)  "享"取"共享"之意,"元"取"单元"之意. 意图 运用共享技术,有效的支持大量细粒度 ...

  4. 设计模式(十)享元模式Flyweight(结构型)

    设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...

  5. 结构型模式—享元模式

    原文作者:java_my_life 原文地址:<JAVA与模式>之享元模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述享元(Flyweight)模式的: Flyweig ...

  6. 设计模式:享元模式(Flyweight)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  7. 26享元模式(Flyweight Pattern)

    面向对象的代价     面向对象很好地解决了系统抽象性的问题,同时在大多数情况下,也不会损及系统的性能.但是,在 某些特殊的应用中下,由于对象的数量太大,采用面向对象会给系统带来难以承受的内存开销.比 ...

  8. 结构模式--之--享元模式

    享元模式是对象的结构模式,享元模式以共享的方式高效地支持大量的细粒度对象.享元对象能做到共享的关键区分内蕴状态和外蕴状态. 一个内蕴状态是存储在享元对象内部的,并且是不会随着环境改变而有所不同,因此, ...

  9. 设计模式GOF23之-------------------结构型模式(适配器模式、代理模式、桥接模式、装饰模式、组合模式、外观模式、享元模式)

    一 结构型模式 二 适配器模式 下面我将用代码模拟键盘usb接口和ps/2的转接器 的适配器过程: 首先定义客户需求: package GOF23;public interface Target {v ...

最新文章

  1. python中使用squarify包可视化treemap图:treemap将分层数据显示为一组嵌套矩形,每一组都用一个矩形表示,该矩形的面积与其值成正比
  2. 提交代码,SVN被锁定,提示:svn is already locked解决方案
  3. JavaScript 四. Math对象的属性和方法
  4. flex组合流动布局实例---利用css的order属性改变盒子排列顺序
  5. 强大的DataGrid组件[13]_字段过滤(Filter)——Silverlight学习笔记[21]
  6. MFC控件的绘制与响应顺序——ZOrder
  7. 3DSlicer20:GUI Structure
  8. MySQL工作笔记-检索出某一时间段中的数据,并更新
  9. js错误: XXX变量 is not a function
  10. javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转换为YUV、BGR24或RGB24等图像像素数据...
  11. 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·011【视图和索引】
  12. mysql 锁_浅谈MySQL的七种锁
  13. 使用MySQL管理工具-SQLyog9.63报错号码2003,超详细解析
  14. 银行开发专业术语解释和银行系统开发架构的设计思想
  15. 劢领AT| 五分钟,零基础玩转Wing中国电信物联网开放平台
  16. JS获取当前时间是否为节假日,周末
  17. 小米手机Android内存管理基本情况介绍
  18. 【前端三剑客三】 JavaScript
  19. Oracle Database Instant Client
  20. 2021CCPC华为云挑战赛1006

热门文章

  1. sublime text3 注册码,亲测可用
  2. 将COM+ Events进行到底[转]
  3. tw-wr641g ttl串口
  4. java 基础知识巩固_Java基础巩固——《Java核心技术基础·卷一:基础知识》
  5. wxpython使用matplot_测试怎么将MatPlotLib嵌入到wxPython中
  6. Python IDLE(shell清屏配置方法)
  7. STL之map中排序方式的重载
  8. P1019 单词接龙 (DFS)
  9. 你有一份云栖大会的IoT邀请函,请查收
  10. 5G改变物联网解决方案的6种方式