设计模式之组合模式

/**
 * 组合模式
 */
public class Main {
    public static void main(String[] args) {
        Cat catParent = new Cat("cat0");

        Cat catChild1 = new Cat("cat1");
        Cat catChild2 = new Cat("cat2");

        Cat catChild3 = new Cat("cat3");
        Cat catChild4 = new Cat("cat4");

        catParent.addChild(catChild1);
        catParent.addChild(catChild2);

        catChild2.addChild(catChild3);
        catChild2.addChild(catChild4);

        catParent.getChildren().forEach(cat->{
            System.out.println("parent:"+cat);
            System.out.println("{");
            cat.getChildren().forEach(System.out::println);
            System.out.println("}");
        });

    }
}

import java.util.List;

public abstract class Animal {

    private String name;

    private String type;

    private List<Animal> children;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Animal> getChildren() {
        return children;
    }

    public void setChildren(List<Animal> children) {
        this.children = children;
    }

    public abstract void addChild(Animal animal);

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                ", type='" + type + '\'' +
                '}';
    }
}

import java.util.ArrayList;

public class Cat extends Animal {

    public Cat(String name){
        this.setType("cat");
        this.setName(name);
        this.setChildren(new ArrayList<Animal>());
    }

    @Override
    public void addChild(Animal animal) {
        this.getChildren().add(animal);
    }

}

问题:
平时我们经常会有一个对象里包含多个对象,然后这多个对象又包含多个对象,这种对象之间以层级树甚至是图的方式进行组织,这种场景应该如何编程。
用法:
比如大家学习时都遇到过部门树这个编程场景,一个部门下有多个子部门,子部门下还有子部门,层级是不固定,点击可以展开,这就是一个典型的组合关系。
如何组织这种层级关系呢,一般在一个对象里面用数据结构存放着,java的集合对象都是可以的。
这个设计模式的精髓在于,每个组合的元素应该都要加入元素、删除元素和遍历元素的接口,这就体现了组合器的各项功能了。
大家可以思考一下上面说的那个例子,点击部门可以展开下级部门,这个应用在网页端就是用JSON对象来存放这个树状组合结构,如果是用AJAX动态获取下级节点呢,那就是用数据库存放了啊,明白了吗,设计模式很灵活的,说白了只是一种思想,需要我们灵活应用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值