码迷,mamicode.com
首页 > 其他好文 > 详细

结构型模式之组合模式

时间:2018-12-06 23:59:33      阅读:33      评论:0      收藏:0      [点我收藏+]

标签:使用场景   分享图片   .com   block   管理   其他   ima   void   ati   

组合模式也叫合成模式,用来描述部分与整体的关系。

定义:

  • 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

组合模式类图如下所示。

技术分享图片

组合模式提供以下3个角色:

  • 抽象构件(Component)角色:定义参加组合对象的共有方法和属性,规范一些默认的行为接口。
  • 叶子结构(Leaf)角色:叶子对象,其下没有其他的分支,定义出参加组合的原始对象的行为。
  • 树枝构件(Composite)角色:代表参加组合的、其下有分支的树枝对象,它的作用是将树枝和叶子组合成一个树形结构,并定义出管理子对象的方法,如add()、remove()等。

 Component.java

// 定义抽象构件接口
public interface Component {
    public void operation();
}

Composite.java

// 定义树枝构件
public class Composite implements Component {
    // 构件容器
    private ArrayList<Component> componentList = new ArrayList<Component>();
    // 添加构件
    public void add(Component component) {
        this.componentList.add(component);
    }
    // 删除构件
    public void remove(Component component) {
        this.componentList.remove(component);
    }
    // 获取子构件
    public ArrayList<Component> getChild() {
        return this.componentList;
    }
    @Override
    public void operation() {
        System.out.println("业务逻辑代码");
    }
}

 Leaf.java

// 定义叶子结构
public class Leaf implements Component {
    @Override
    public void operation() {
        System.out.println("业务逻辑代码Leaf");
    }
}

Client.java

public class Client {
    public static void main(String[] args) {
        // 创建根节点
        Composite root = new Composite();
        // 创建树枝节点
        Composite branch = new Composite();
        // 创建叶子节点
        Leaf leaf = new Leaf();
        root.add(branch);
        branch.add(leaf);
        display(root);
    }
    // 遍历树递归
    public static void display(Composite root) {
        for (Component c : root.getChild()) {
            if (c instanceof Leaf) { // 如果节点类型是叶子节点
                c.operation();
            } else { // 树枝节点
                c.operation();
                display((Composite) c);
            }
        }
    }
}

优点:

  • 高层模块调用简单。树形结构中的所有节点都是Component,局部和整体对调用者来说没有任何区别,即高层模块不必关心自己处理的是单个对象还是整个组合结构,简化了高层模块的代码。
  • 节点自由增加。使用组合模式后,如果想增加一个树枝节点,树叶节点只需要找到其父节点即可,

缺点:

  • 不易控制树枝构件的类型。
  • 不易使用新的方法来增加新的行为。

使用场景:

  • 需要描述对象的部分和整体的等级结构,如树形菜单、文件和文件夹管理。
  • 需要客户端忽略个体构件和组合构件的区别,平等对待所有的构件。

摘自:

青岛东合信息技术有限公司 . 设计模式(Java版) .  电子工业出版社,2012,86-89.

 

结构型模式之组合模式

标签:使用场景   分享图片   .com   block   管理   其他   ima   void   ati   

原文地址:https://www.cnblogs.com/yewen1234/p/10080189.html

(0)
(0)
   
举报
评论 一句话评论(0
0条  
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!