java 组合模式(大话设计模式)

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

需求中是体现部分与整体层次的结构时,希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑使用组合模式了。组合模式让客户可以一致地使用组合结构和单个对象。【继承+组合 】

在这里插入图片描述

/**
 * Component为组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为。
 * 
 * @author administrator
 *
 */
public abstract class Component {
    protected String name;

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

    public abstract void add(Component component);

    public abstract void remove(Component component);

    public abstract void display(int depth);

}
/**
 * 定义有枝节点行为,用来存储子部件
 * 
 * @author administrator
 *
 */
public class Composite extends Component {
    private List<Component> children = new ArrayList<Component>();

    public Composite(String name) {
	super(name);
    }

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

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

    @Override
    public void display(int depth) {
	// 显示其枝节点名称,并对其下级进行遍历
	System.out.println(StringUtil.repeatableString("-", depth) + this.name);

	for (Component component : children) {
	    component.display(depth + 2);
	}

    }

}
/**
 * Leaf在组合中表示叶节点对象,叶节点没有子节点
 * 
 * @author administrator
 *
 */
public class Leaf extends Component {

    public Leaf(String name) {
	super(name);
    }

    @Override
    public void add(Component component) {
	System.out.println("cannot add to a leaf");
    }

    @Override
    public void remove(Component component) {
	System.out.println("cannot remove from a leaf");
    }

    @Override
    public void display(int depth) {
	// 通过“-”的数目显示级别
	System.out.println(StringUtil.repeatableString("-", depth) + this.name);
    }

}
/**
 * 客户端。通过Component接口操作组合部件的对象
 * 
 * @author administrator
 *
 */
public class CompositeClient {

    public static void main(String[] args) {
	// 生成树根,根上长出两叶Leaf A和Leaf B
	Composite root = new Composite("root");
	root.add(new Leaf("Leaf A"));
	root.add(new Leaf("Leaf B"));

	// 根上长出分支Composite X,分支上也有两叶Leaf X-A和Leaf X-B
	Composite compositeX = new Composite("Composite X");
	compositeX.add(new Leaf("Leaf X-A"));
	compositeX.add(new Leaf("Leaf X-B"));
	root.add(compositeX);

	// 在Composite X上再长出分支Composite X-Y,分支上也有两叶Leaf X-Y-A和Leaf X-Y-B
	Composite compositeXY = new Composite("Composite X-Y");
	compositeXY.add(new Leaf("Leaf X-Y-A"));
	compositeXY.add(new Leaf("Leaf X-Y-B"));
	compositeX.add(compositeXY);

	// 显示大树的样子
	root.display(1);
    }
}

案例 部门

/**
 * 组合模式(Composite)
 * 公司抽象类
 */
public abstract class Company {

    protected String name;

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

    public abstract void add(Company company);// 增加
    public abstract void remove(Company company);// 移除
    public abstract void display(int depth);// 显示
    public abstract void lineOfDuty();// 职责

}
/**
 * 组合模式(Composite)
 * 具体公司类
 */
public class ConcreteCompany extends Company {

    private List<Company> children = new ArrayList<>();

    public ConcreteCompany(String name) {
        super(name);
    }

    @Override
    public void add(Company company) {
        children.add(company);
    }

    @Override
    public void remove(Company company) {
        children.remove(company);
    }

    @Override
    public void display(int depth) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < depth; i++) {
            sb.append("-");
        }
        System.out.println(sb + name);
        for (Company c : children) {
            c.display(depth + 2);
        }
    }

    @Override
    public void lineOfDuty() {
        for (Company c : children) {
            c.lineOfDuty();
        }
    }
}
/**
 * 组合模式(Composite)
 * 财务部
 */
public class FinanceDepartment extends Company {

    public FinanceDepartment(String name) {
        super(name);
    }

    @Override
    public void add(Company company) {
        // None
    }

    @Override
    public void remove(Company company) {
        // None
    }

    @Override
    public void display(int depth) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < depth; i++) {
            sb.append("-");
        }
        System.out.println(sb + name);
    }

    @Override
    public void lineOfDuty() {
        System.out.println(name + " 公司财务收支管理");
    }

}
/**
 * 组合模式(Composite)
 * 人力资源部
 */
public class HRDepartment extends Company {

    public HRDepartment(String name) {
        super(name);
    }

    @Override
    public void add(Company company) {
        // None
    }

    @Override
    public void remove(Company company) {
        // None
    }

    @Override
    public void display(int depth) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < depth; i++) {
            sb.append("-");
        }
        System.out.println(sb + name);
    }

    @Override
    public void lineOfDuty() {
        System.out.println(name + " 员工招聘管理培训");
    }

}
/**
 * 组合模式(Composite)
 * 客户端main方法
 */
public class Client {

    public static void main(String[] args) {
        ConcreteCompany root = new ConcreteCompany("北京总公司");
        root.add(new HRDepartment("总公司人力资源部"));
        root.add(new FinanceDepartment("总公司财务部"));

        ConcreteCompany company = new ConcreteCompany("上海华东分公司");
        company.add(new HRDepartment("华东分公司人力资源部"));
        company.add(new FinanceDepartment("华东分公司财务部"));
        root.add(company);

        ConcreteCompany company1 = new ConcreteCompany("南京办事处");
        company1.add(new HRDepartment("南京办事处人力资源部"));
        company1.add(new FinanceDepartment("南京办事处财务部"));
        company.add(company1);

        ConcreteCompany company2 = new ConcreteCompany("杭州办事处");
        company2.add(new HRDepartment("杭州办事处人力资源部"));
        company2.add(new FinanceDepartment("杭州办事处财务部"));
        company.add(company2);

        System.out.println("结构图:");
        root.display(1);

        System.out.println("职责:");
        root.lineOfDuty();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值