Java设计模式之组合模式的示例详解
定义
组合模式,又叫部分整体模式,它创建了对象组的数据结构(将对象组合成树状结构,用来表示部分整体的层级关系)组合模式使得用户对单个对象和组合对象的访问具有一致性
原理类图
Component :这是组合模式中的抽象构件,他里面定义了所有类共有的默认行为,用来访问和管理Component的子部件,Component可以是抽象类,也可以是接口
leaf :在组合模式中表示叶子节点,叶子节点没有子节点了,他是最末端存放数据的结构
Composite:非叶子节点,下面仍然有分支,用来存储分支,实现了Component 定义的默认行为
案例
需求
商场的服装店,专卖店,衣服,裤子的关系
方案
定义组合模式的抽象构件
public abstract class Component { private String name; private String desc; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public Component(String name, String desc) { this.name = name; this.desc = desc; } public void add(Component component){ throw new UnsupportedOperationException(); } public void remove(Component component){ throw new UnsupportedOperationException(); } public abstract void show(); }
定义服装商铺类
public class Store extends Component{ List<Component> componentList = new ArrayList<Component>(); public Store(String name, String desc){ super(name, desc); } @Override public String getName() { return super.getName(); } @Override public String getDesc() { return super.getDesc(); } @Override public void add(Component component) { System.out.println("添加:" + getName()); componentList.add(component); } @Override public void remove(Component component) { System.out.println("移除:" + getName()); componentList.remove(component); } @Override public void show() { for (Component component : componentList) { System.out.println(component.getName()); component.show(); } } }
定义服装专卖店商铺
public class BrandStore extends Component{ List<Component> componentList = new ArrayList<Component>(); public BrandStore(String name, String desc) { super(name, desc); } @Override public String getName() { return super.getName(); } @Override public String getDesc() { return super.getDesc(); } @Override public void add(Component component) { componentList.add(component); } @Override public void remove(Component component) { componentList.remove(component); } @Override public void show() { for (Component component : componentList) { System.out.println(component.getName()); component.show(); } } }
定义运动装
public class Sportswear extends Component{ List<Component> componentList = new ArrayList<Component>(); @Override public String getName() { return super.getName(); } @Override public String getDesc() { return super.getDesc(); } public Sportswear(String name, String desc) { super(name, desc); } @Override public void add(Component component) { componentList.add(component); } @Override public void remove(Component component) { componentList.remove(component); } @Override public void show() { for (Component component: componentList) { System.out.println(component.getName()); } } }
定义测试类
public class Test { public static void main(String[] args) { // 服装店 Component store = new Store("服装店","服装店"); // 专卖店 Component brandStore1 = new BrandStore("李宁服装专卖店","李宁服装专卖店"); Component brandStore2 = new BrandStore("361服装专卖店","361服装专卖店"); // 运动装 Component sportswear1 = new Sportswear("运动装","运动装"); Component sportswear2 = new Sportswear("休闲装","休闲装"); brandStore1.add(sportswear1); brandStore2.add(sportswear2); store.add(brandStore1); store.add(brandStore2); store.show(); } }
查看测试结果
分析
该案例中,服装店(Store),专卖店(BrandStore),运动装(Sportswear)都继承了抽象构件(Component),通过持有一个list来管理自身持有的对象,这样客户端就可以一致处理单个对象和组合对象,屏蔽了对象层次的差异性,这样的话,一致的行为就可以控制不同的层次了。
总结
优势
组合模式可以使得客户端代码可以一致的处理单个对象和组合对象,无须关心自己处理的是单个还是组合,屏蔽了对象系统的层次差异性,这样的话一致的行为就可以控制不同层次了
扩展性非常高,可以很方便的增加叶子节点和非叶子节点,并且对于现有的类库无侵入,满足开闭原则
劣势
如果说各个节点有很大差异的话,不适合使用组合模式
使用场景
处理树形结构,具备统一行为,建议大家使用组合模式
想体现对象的部分,整体结构的时候,可以使用组合模式,典型一点例如文件和文件夹
到此这篇关于Java设计模式之组合模式的示例详解的文章就介绍到这了,更多相关Java组合模式内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
原文出处:https://juejin.cn/post/7069958409193259045
相关文章
- 这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
java 运行报错has been compiled by a more recent version of the Java Runtime
java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
- 神马是“解释器模式”?先翻开《GOF》看看Definition:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。在开篇之前还是要科普几个概念: 抽象语法树: 解释器模式并未解释如...2014-06-07
- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
- 这篇文章主要为大家介绍了JavaScript设计模式中的装饰者模式,对JavaScript设计模式感兴趣的小伙伴们可以参考一下...2016-01-21
- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
java 画pdf用itext调整表格宽度、自定义各个列宽的方法
这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31- 这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)
这篇文章主要介绍了Java使用ScriptEngine动态执行代码,并且分享Java几种动态执行代码比较,需要的朋友可以参考下...2021-04-15- 这篇文章主要介绍了Java开发实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-03
- 这篇文章主要介绍了Java List集合返回值去掉中括号('[ ]')的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-29
Java中lombok的@Builder注解的解析与简单使用详解
这篇文章主要介绍了Java中lombok的@Builder注解的解析与简单使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-06- 下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解
这篇文章主要介绍了Java 8 Stream Collectors 功能与操作方法,结合实例形式详细分析了Java 8 Stream Collectors 功能、操作方法及相关注意事项,需要的朋友可以参考下...2020-05-20