经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
Java设计模式之组合模式的示例详解
来源:jb51  时间:2022/3/1 13:39:56  对本文有异议

定义

组合模式,又叫部分整体模式,它创建了对象组的数据结构(将对象组合成树状结构,用来表示部分整体的层级关系)组合模式使得用户对单个对象和组合对象的访问具有一致性

原理类图

Component :这是组合模式中的抽象构件,他里面定义了所有类共有的默认行为,用来访问和管理Component的子部件,Component可以是抽象类,也可以是接口

leaf :在组合模式中表示叶子节点,叶子节点没有子节点了,他是最末端存放数据的结构

Composite:非叶子节点,下面仍然有分支,用来存储分支,实现了Component 定义的默认行为

案例

需求

商场的服装店,专卖店,衣服,裤子的关系

方案

定义组合模式的抽象构件

  1. public abstract class Component {
  2. private String name;
  3. private String desc;
  4.  
  5. public String getName() {
  6. return name;
  7. }
  8.  
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12.  
  13. public String getDesc() {
  14. return desc;
  15. }
  16.  
  17. public void setDesc(String desc) {
  18. this.desc = desc;
  19. }
  20.  
  21. public Component(String name, String desc) {
  22. this.name = name;
  23. this.desc = desc;
  24. }
  25.  
  26. public void add(Component component){
  27. throw new UnsupportedOperationException();
  28. }
  29.  
  30. public void remove(Component component){
  31. throw new UnsupportedOperationException();
  32. }
  33.  
  34. public abstract void show();
  35. }

定义服装商铺类

  1. public class Store extends Component{
  2.  
  3. List<Component> componentList = new ArrayList<Component>();
  4.  
  5. public Store(String name, String desc){
  6. super(name, desc);
  7. }
  8.  
  9. @Override
  10. public String getName() {
  11. return super.getName();
  12. }
  13.  
  14. @Override
  15. public String getDesc() {
  16. return super.getDesc();
  17. }
  18.  
  19. @Override
  20. public void add(Component component) {
  21. System.out.println("添加:" + getName());
  22. componentList.add(component);
  23. }
  24.  
  25. @Override
  26. public void remove(Component component) {
  27. System.out.println("移除:" + getName());
  28. componentList.remove(component);
  29. }
  30.  
  31. @Override
  32. public void show() {
  33. for (Component component : componentList) {
  34. System.out.println(component.getName());
  35. component.show();
  36. }
  37. }
  38. }

定义服装专卖店商铺

  1. public class BrandStore extends Component{
  2.  
  3. List<Component> componentList = new ArrayList<Component>();
  4.  
  5. public BrandStore(String name, String desc) {
  6. super(name, desc);
  7. }
  8.  
  9. @Override
  10. public String getName() {
  11. return super.getName();
  12. }
  13.  
  14. @Override
  15. public String getDesc() {
  16. return super.getDesc();
  17. }
  18.  
  19. @Override
  20. public void add(Component component) {
  21. componentList.add(component);
  22. }
  23.  
  24. @Override
  25. public void remove(Component component) {
  26. componentList.remove(component);
  27. }
  28.  
  29. @Override
  30. public void show() {
  31. for (Component component : componentList) {
  32. System.out.println(component.getName());
  33. component.show();
  34. }
  35. }
  36. }

定义运动装

  1. public class Sportswear extends Component{
  2.  
  3. List<Component> componentList = new ArrayList<Component>();
  4.  
  5. @Override
  6. public String getName() {
  7. return super.getName();
  8. }
  9.  
  10. @Override
  11. public String getDesc() {
  12. return super.getDesc();
  13. }
  14.  
  15. public Sportswear(String name, String desc) {
  16. super(name, desc);
  17. }
  18.  
  19. @Override
  20. public void add(Component component) {
  21. componentList.add(component);
  22. }
  23.  
  24. @Override
  25. public void remove(Component component) {
  26. componentList.remove(component);
  27. }
  28.  
  29. @Override
  30. public void show() {
  31. for (Component component: componentList) {
  32. System.out.println(component.getName());
  33. }
  34. }
  35. }

定义测试类

  1. public class Test {
  2. public static void main(String[] args) {
  3. // 服装店
  4. Component store = new Store("服装店","服装店");
  5.  
  6. // 专卖店
  7. Component brandStore1 = new BrandStore("李宁服装专卖店","李宁服装专卖店");
  8. Component brandStore2 = new BrandStore("361服装专卖店","361服装专卖店");
  9.  
  10. // 运动装
  11. Component sportswear1 = new Sportswear("运动装","运动装");
  12. Component sportswear2 = new Sportswear("休闲装","休闲装");
  13.  
  14. brandStore1.add(sportswear1);
  15. brandStore2.add(sportswear2);
  16.  
  17. store.add(brandStore1);
  18. store.add(brandStore2);
  19. store.show();
  20. }
  21. }

查看测试结果

分析

该案例中,服装店(Store),专卖店(BrandStore),运动装(Sportswear)都继承了抽象构件(Component),通过持有一个list来管理自身持有的对象,这样客户端就可以一致处理单个对象和组合对象,屏蔽了对象层次的差异性,这样的话,一致的行为就可以控制不同的层次了。

总结

优势

组合模式可以使得客户端代码可以一致的处理单个对象和组合对象,无须关心自己处理的是单个还是组合,屏蔽了对象系统的层次差异性,这样的话一致的行为就可以控制不同层次了

扩展性非常高,可以很方便的增加叶子节点和非叶子节点,并且对于现有的类库无侵入,满足开闭原则

劣势

如果说各个节点有很大差异的话,不适合使用组合模式

使用场景

处理树形结构,具备统一行为,建议大家使用组合模式

想体现对象的部分,整体结构的时候,可以使用组合模式,典型一点例如文件和文件夹

到此这篇关于Java设计模式之组合模式的示例详解的文章就介绍到这了,更多相关Java组合模式内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号