设计模式之组合模式

GoF的设计模式是这么说的:

意图:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
适用性:1. 你想表示对象的部分-整体层次结构。 2. 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

以上文字虽然说得已经很明白了,但还是有点抽象。

举个栗子吧,我们都直到Java中的AWT与SWING中的那些组件,像Button,RadioButton,CheckBox等待,这些就相当于部件,也被称为树叶(对应下面代码的leaf),而Container是用在装载这些部件的,也叫做树枝。

最关键的部分就是树枝内部组合该接口,并且含有内部属性 List,里面放 Component

首先创建Component接口:

package com.structural.composite;
public interface Component {
    public void sayHello();
    public void sayGoodbye();
}

然后上面的接口写一个实现:

package com.structural.composite;

import java.util.ArrayList;
import java.util.List;

public class Composite implements Component {
    List<Component> components = new ArrayList<Component>();

    @Override
    public void sayHello() {
        for (Component component : components) {
            component.sayHello();
        }
    }

    @Override
    public void sayGoodbye() {
        for (Component component : components) {
            component.sayGoodbye();
        }
    }

    public void add(Component component) {
        components.add(component);
    }

    public void remove(Component component) {
        components.remove(component);
    }

    public List<Component> getComponents() {
        return components;
    }

    public Component getComponent(int index) {
        return components.get(index);
    }

}

然后呢,实现一下叶子类。

package com.structural.composite;

public class Leaf implements Component {
    String name;

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

    @Override
    public void sayHello() {
        // TODO Auto-generated method stub
        System.out.println(name + " leaf says hello");
    }

    @Override
    public void sayGoodbye() {
        // TODO Auto-generated method stub
        System.out.println(name + " leaf says goodbye");
    }
}
package com.structural.composite;

public class TestCompositePattern {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Leaf leaf1 = new Leaf("Bob");
        Leaf leaf2 = new Leaf("Fred");
        Leaf leaf3 = new Leaf("Sue");
        Leaf leaf4 = new Leaf("Ellen");
        Leaf leaf5 = new Leaf("Joe");

        Composite composite1 = new Composite();
        composite1.add(leaf1);
        composite1.add(leaf2);

        Composite composite2 = new Composite();
        composite2.add(leaf3);
        composite2.add(leaf4);

        Composite composite3 = new Composite();
        composite3.add(composite1);
        composite3.add(composite2);
        composite3.add(leaf5);

        System.out.println("Calling 'sayHello' on leaf1");
        leaf1.sayHello();

        System.out.println("\nCalling 'sayHello' on composite1");
        composite1.sayHello();

        System.out.println("\nCalling 'sayHello' on composite2");
        composite2.sayHello();

        System.out.println("\nCalling 'sayGoodbye' on composite3");
        composite3.sayGoodbye();
    }

}

输出:

Calling 'sayHello' on leaf1
Bob leaf says hello

Calling 'sayHello' on composite1
Bob leaf says hello
Fred leaf says hello

Calling 'sayHello' on composite2
Sue leaf says hello
Ellen leaf says hello

Calling 'sayGoodbye' on composite3
Bob leaf says goodbye
Fred leaf says goodbye
Sue leaf says goodbye
Ellen leaf says goodbye
Joe leaf says goodbye

最后还是来一张UML图

这里写图片描述

参考文献

[1]《设计模式——可复用面向对象软件的基础》,Erich Gramma,Richard Helm,Ralph Johnson,John Vlossides。机械工业出版社
[2] https://github.com/ncsbalaji/DesignPaterns
[3] http://www.runoob.com/design-pattern/composite-pattern.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值