组合模式-树枝叶子模式-结构型

组合模式的结构与实现

组合模式的结构不是很复杂,下面对它的结构和实现进行分析。

1. 模式的结构

组合模式包含以下主要角色。

  1. 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。(总的抽象类或接口,定义一些通用的方法,比如新增、删除)

  2. 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于继承或实现抽象构件。

  3. 树枝构件(Composite)角色 / 中间构件:是组合中的分支节点对象,它有子节点,用于继承和实现抽象构件。它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。

 

 

 

 

区别是否提供Component非叶子构件的抽象方法

public class CompositePattern {
   public static void main(String[] args) {
       Component c0 = new Composite();
       Component c1 = new Composite();
       Component leaf1 = new Leaf("1");
       Component leaf2 = new Leaf("2");
       Component leaf3 = new Leaf("3");
       c0.add(leaf1);
       c0.add(c1);
       c1.add(leaf2);
       c1.add(leaf3);
       c0.operation();
  }
}

//抽象构件
interface Component {
   public void add(Component c);

   public void remove(Component c);

   public Component getChild(int i);

   public void operation();
}

//树叶构件
class Leaf implements Component {
   private String name;

   public Leaf(String name) {
       this.name = name;
  }

   public void add(Component c) {
  }

   public void remove(Component c) {
  }

   public Component getChild(int i) {
       return null;
  }

   public void operation() {
       System.out.println("树叶" + name + ":被访问!");
  }
}

//树枝构件
class Composite implements Component {
   private ArrayList<Component> children = new ArrayList<Component>();

   public void add(Component c) {
       children.add(c);
  }

   public void remove(Component c) {
       children.remove(c);
  }

   public Component getChild(int i) {
       return children.get(i);
  }

   public void operation() {
       for (Object obj : children) {
          ((Component) obj).operation();
      }
  }
}

安全组合模式

安全式的组合模式与透明式组合模式的实现代码类似,只要对其做简单修改就可以了,代码如下。

首先修改 Component 代码,只保留层次的公共行为。

interface Component {    public void operation();}

然后修改客户端代码,将树枝构件类型更改为 Composite 类型,以便获取管理子类操作的方法。

public class CompositePattern {
   public static void main(String[] args) {
       Composite c0 = new Composite();
       Composite c1 = new Composite();
       Component leaf1 = new Leaf("1");
       Component leaf2 = new Leaf("2");
       Component leaf3 = new Leaf("3");
       c0.add(leaf1);
       c0.add(c1);
       c1.add(leaf2);
       c1.add(leaf3);
       c0.operation();
  }
}
posted @   8023渡劫  阅读(228)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示