组合模式(Composite Pattern)

意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

何时使用:1、您想表示对象的部分-整体层次结构(树形结构)。2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

关键代码:树枝内部组合该接口,并且含有内部属性 List,里面放 Component。

类图:这里从类图可以很好的理解,恩,复习的时候再画用于深化~

代码:这里我使用了四人帮《java设计模式》一书中的经典例子做演示,简化了一些内容,以便理解其核心-结构


1、组合接口

package com.pat.composite;
/**
* 组合类接口,普通叶子和含有很多叶子的枝干都实现本接口
* @author ZX
*
*/
public interface Composite {
void operation();
void add(Composite leaf);
void remove(); }

2、单独的实现类-叶子、

package com.pat.composite;
/**
* 绿色的树叶
* @author ZX
*
*/
public class GreenLeaf implements Composite{
@Override
public void operation() {
System.out.println("摘一片绿叶"); }
@Override
public void add(Composite leaf) {
// TODO Auto-generated method stub }
@Override
public void remove() {
// TODO Auto-generated method stub } }
package com.pat.composite;
/**
* 黄色的树叶
* @author ZX
*/
public class YellowLeaf implements Composite{
@Override
public void operation() {
System.out.println("摘一片黄叶");
} @Override
public void add(Composite leaf) {
}
@Override
public void remove() {
}
}

3、枝干实现类-枝干上有许多叶子:

package com.pat.composite;

import java.util.ArrayList;
import java.util.List; /**
* 树枝,上面有很多树叶
* @author ZX
*
*/
public class Branch implements Composite{
//树枝上所有的叶子集合
List<Composite> leafs = new ArrayList<>();
@Override
public void operation() {
operateAll();
}
@Override
public void add(Composite leaf) {
}
@Override
public void remove() {
}
public void operateAll() {
for(Composite leaf:leafs) {
leaf.operation();
} }
//后早方法
public Branch() {
//这里我简单添加了一些树叶类,未使用传入参数,核心不在于此
leafs.add(new GreenLeaf());
leafs.add(new GreenLeaf());
leafs.add(new GreenLeaf());
leafs.add(new YellowLeaf());
leafs.add(new YellowLeaf());
leafs.add(new YellowLeaf());
} }

4、测试类:

package com.pat.composite;

public class Test {
public static void main(String[] args) {
System.out.println("===========================");
Composite green = new GreenLeaf();
green.operation();
System.out.println("===========================");
Composite yellow = new YellowLeaf();
yellow.operation();
System.out.println("===========================");
Composite branch = new Branch();
branch.operation();
System.out.println("===========================");
}
}

5、结果:

===========================
摘一片绿叶
===========================
摘一片黄叶
===========================
摘一片绿叶
摘一片绿叶
摘一片绿叶
摘一片黄叶
摘一片黄叶
摘一片黄叶
===========================

最新文章

  1. ie7下&lt;a&gt;&lt;/a&gt;标签中&lt;input /&gt;时不反应
  2. Linux终端更改提示符
  3. C# 调用api的方法
  4. java + jni + mingw实例开发(基于命令行窗口模式)
  5. Nmap备忘单:从探索到漏洞利用(Part 4)
  6. [Offer收割]编程练习赛4 A 满减优惠
  7. 转:ORACLE制造方法的比较
  8. 【C#基础】json数据解析
  9. SQL约束脚本的用法
  10. .net ElasticSearch-Sql 扩展类
  11. [转载] Redis快速入门
  12. Luogu1613 跑路
  13. 《JavaScript高级程序设计》笔记:HTML5脚本编程(16)
  14. 让你提前认识软件开发(21):C程序中的定时器
  15. Vue2 第三天学习
  16. git revert 撤销merge的动作
  17. Smartmontools硬盘检测工具
  18. ASP.NET Core2.0 环境下MVC模式的支付宝PC网站支付接口-沙箱环境开发测试
  19. #JS Ajax的error函数
  20. Java之重载(Overload)与重写(Overwrite)总结

热门文章

  1. 极简代码(八)—— binary activation function
  2. Python第一个基本教程4章 词典: 当指数不工作时也
  3. DataGrid数据绑定
  4. Ubuntu更改 resolv.conf 重启失效
  5. C# 自定义泛型类,并添加约束
  6. android x86 7.0 32bit调试apk时出现的错误
  7. Android零基础入门第56节:翻转视图ViewFlipper打造引导页和轮播图
  8. 16.09 working note
  9. The specified type member &#39;IsLock&#39; is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
  10. 【UWP开发】uwp应用安装失败