关于“组成模式”的具体讲解请看笔者博客
《设计模式》第三部分 结构型设计模式 第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();
}
}
结果同上。