《设计模式》第三部分 结构型设计模式 第11章 组成模式(组合模式)(B:Java实现)

关于“组成模式”的具体讲解请看笔者博客

《设计模式》第三部分 结构型设计模式 第11章 组成模式(组合模式)(A:C++实现)

此文是“组成模式”的Java实现。

透明式的组合模式的实现代码

第一步:抽象构件

package com;

public interface Component {
	
	public void operation();
	public void add(Component c);
    public void remove(Component c);
    public Component getChild(int i);
    public void print();
    
}

第二步:树叶构件

package com;

public class Leaf implements Component{

    private String name;
    public Leaf(String name)
    {
        this.name=name;
    }
    
	@Override
	public void operation() {
		
		System.out.println("I am "+name); 
	}

	@Override
	public void add(Component c) {
	}

	@Override
	public void remove(Component c) {
	}

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

	@Override
	public void print() {

	}
}

第三步:树枝构件

package com;

import java.util.ArrayList;

public class Composite implements Component{

    private String name;
    public Composite(String name)
    {
        this.name=name;
    }
    
	private ArrayList<Component> children=new ArrayList<Component>(); 
	
	@Override
	public void operation() {
		System.out.println("I am "+name); 
	}

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

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

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

	@Override
	public void print() {
		for(Object obj:children)
        {
            ((Component)obj).operation();
        }
	}
}

第四步:测试

package com;

public class Main {

	public static void main(String[] args) {

		Component Node = new Composite("Beijing Head Office");
	    Component NodeHr = new Leaf("Beijing Human Resources Department");

	    Component SubNodeSh = new Composite("Shanghai Branch");
	    Component SubNodeCd = new Composite("Chengdu Branch");
	    Component SubNodeBt = new Composite("Baotou Branch");
	    Node.add(NodeHr);
	    Node.add(SubNodeSh);
	    Node.add(SubNodeCd);
	    Node.add(SubNodeBt);
	    Node.print();
	    
	    System.out.println("------------------------------------");
	    Component SubNodeShHr = new Leaf("Shanghai Human Resources Department");
	    Component SubNodeShCg = new Leaf("Shanghai Purchasing Department");
	    Component SubNodeShXs = new Leaf("Shanghai Sales department");
	    Component SubNodeShZb = new Leaf("Shanghai Quality supervision Department");

	    SubNodeSh.add(SubNodeShHr);
	    SubNodeSh.add(SubNodeShCg);
	    SubNodeSh.add(SubNodeShXs);
	    SubNodeSh.add(SubNodeShZb);

	    SubNodeSh.print();
	    System.out.println("------------------------------------");
	    // 公司不景气,需要关闭上海质量监督部门
	    SubNodeSh.remove(SubNodeShZb);
	    SubNodeSh.print();
	}
}

结果如下所示:
在这里插入图片描述

安全式的组合模式的实现代码

第一步:抽象构件

package com;

public interface Component {
	
	public void operation();
}

第二步:树叶构件

package com;

public class Leaf implements Component{

    private String name;
    public Leaf(String name)
    {
        this.name=name;
    }
    
	@Override
	public void operation() {
		
		System.out.println("I am "+name); 
	}
}

第三步:树枝构件

package com;

import java.util.ArrayList;

public class Composite implements Component{

    private String name;
    public Composite(String name)
    {
        this.name=name;
    }
    
	private ArrayList<Component> children=new ArrayList<Component>(); 
	
	@Override
	public void operation() {
		System.out.println("I am "+name); 
	}

	public void add(Component c) {
		children.add(c);
	}

	public void remove(Component c) {
		children.remove(c);
	}

	public Component getChild(int i) {
        return children.get(i);
	}

	public void print() {
		for(Object obj:children)
        {
            ((Component)obj).operation();
        }
	}

}

第四步:测试

package com;

public class Main {

	public static void main(String[] args) {

		Composite Node = new Composite("Beijing Head Office");
		Leaf NodeHr = new Leaf("Beijing Human Resources Department");

		Composite SubNodeSh = new Composite("Shanghai Branch");
		Composite SubNodeCd = new Composite("Chengdu Branch");
		Composite SubNodeBt = new Composite("Baotou Branch");
	    Node.add(NodeHr);
	    Node.add(SubNodeSh);
	    Node.add(SubNodeCd);
	    Node.add(SubNodeBt);
	    Node.print();
	    
	    System.out.println("------------------------------------");
	    Leaf SubNodeShHr = new Leaf("Shanghai Human Resources Department");
	    Leaf SubNodeShCg = new Leaf("Shanghai Purchasing Department");
	    Leaf SubNodeShXs = new Leaf("Shanghai Sales department");
	    Leaf SubNodeShZb = new Leaf("Shanghai Quality supervision Department");

	    SubNodeSh.add(SubNodeShHr);
	    SubNodeSh.add(SubNodeShCg);
	    SubNodeSh.add(SubNodeShXs);
	    SubNodeSh.add(SubNodeShZb);

	    SubNodeSh.print();
	    System.out.println("------------------------------------");
	    // 公司不景气,需要关闭上海质量监督部门
	    SubNodeSh.remove(SubNodeShZb);
	    SubNodeSh.print();
	}
}

结果同上。

猜你喜欢

转载自blog.csdn.net/u013162035/article/details/104370312