Design Pattern(7)-Composite Pattern

适用场景

组合模式适用于树形结构。试想一个公司的所有员工,肯定有上下级关系,除了最底层的员工,其他员工都有自己的领导和自己管理的员工。Composite Pattern通过让每个非最底层员工持有自己的直接下属,从而实现这种树形结构。
因为公司的每个员工都具有一些共性,所以为他们设计一个公共父类或者接口,譬如Component或者叫Employee。但是最低层员工和非最底层员工有一些区别,因为最底层员工不允许添加下属,所以再设两个子类。

类图

这里写图片描述

实例代码

Component

public interface Component {
    void add(Component component);
    void remove(Component component);
    void action();
    Component getChild(int index);
}

Composite:

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

public class Composite implements  Component{
    private String num;
    List<Component> children;

    public Composite(String num) {
        this.num=num;
        this.children=new ArrayList<>();
    }

    @Override
    public void add(Component component) {
        if(!children.contains(component))
            children.add(component);
    }

    @Override
    public void remove(Component component) {
        if(children.contains(component))
            children.remove(component);
    }

    @Override
    public void action() {
        for(Component component:children)
            component.action();
        System.out.print(this.num+"\t");
    }

    @Override
    public Component getChild(int index) {
        return children.get(index);
    }
}

LeafEmployee:

public class LeafEmployee implements Component{
    private String name;

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

    @Override
    public void add(Component component) {
        return;
    }

    @Override
    public void remove(Component component) {
        return;
    }

    @Override
    public void action() {
        System.out.print(this.name+"\t");
    }

    @Override
    public Component getChild(int index) {
        return null;
    }
}

Client:

public class Client {
    public static void main(String[] args){
        Component manager=new Composite("总经理");
        Component vice_manager=new Composite("副经理");
        Component leaf1=new LeafEmployee("小张");
        Component leaf2=new LeafEmployee("小王");
        manager.add(vice_manager);
        vice_manager.add(leaf1);
        vice_manager.add(leaf2);

        manager.action();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值