1,为什么要使用组合设计模式
有时候我们会遇到一种对象之间存在时层级关系(注意这里是指的对象),如
那么,我们有没有必要为每一个对象都单独写类?当然没有必要,那么这其实就是一棵树型的对象结构了.组合设计模式就是为了这种结构而生的.
由Component派生出了Leaf和Composite这两个,分别称之为叶节点和支节点.叶节点不具有增加和消除节点的能力.
2,什么是组合设计模式
组合设计模式将对象组合成树形结构以表示"部分-整体"的关系
3,怎么使用组合设计模式
UML类图
舵主在这里作为了支节点,左护法和右护法作为了叶节点.
具体的代码:
成员.interface
public interface 成员{
public void 增加成员(成员 c);
public void 减少成员(成员 c);
public void 显示成员职能();
}
舵主.class
public class 舵主 implements 成员{
public final static int 总舵主 = 0;
public final static int 分舵主 = 1;
private String name;
ArrayList<成员> list = new ArrayList<成员>();
public 舵主(int type) throws Exception{
if(type < 0 || type > 1){
throw new Exception("类型错误");
}
switch(type){
case 舵主.总舵主:
name = "总舵主";
break;
case 舵主.分舵主:
name = "分舵主";
break;
default:
break;
}
}
@Override
public void 增加成员(成员 c) {
// TODO Auto-generated method stub
list.add(c);
}
@Override
public void 减少成员(成员 c) {
// TODO Auto-generated method stub
list.remove(c);
}
@Override
public void 显示成员职能() {
// TODO Auto-generated method stub
System.out.print("我是"+name+"\n");
for(成员 c : list){
if(!(c instanceof 舵主)){
c.显示成员职能();
}
}
System.out.print("--------------"+"\n");
}
}
左护法.class
public class 左护法 implements 成员{
//叶节点是不能增加和减少节点的
@Override
public void 增加成员(成员 c) {
// TODO Auto-generated method stub
System.out.print("护法是不能增加成员的\n");
}
//叶节点是不能增加和减少节点的
@Override
public void 减少成员(成员 c) {
// TODO Auto-generated method stub
System.out.print("护法是不能减少成员的\n");
}
@Override
public void 显示成员职能() {
// TODO Auto-generated method stub
System.out.print("左护法保护舵主\n");
}
}
右护法.class
public class 右护法 implements 成员{
//叶节点是不能增加和减少节点的
@Override
public void 增加成员(成员 c) {
// TODO Auto-generated method stub
System.out.print("护法是不能增加成员的\n");
}
//叶节点是不能增加和减少节点的
@Override
public void 减少成员(成员 c) {
// TODO Auto-generated method stub
System.out.print("护法是不能减少成员的\n");
}
@Override
public void 显示成员职能() {
// TODO Auto-generated method stub
System.out.print("右护法保护舵主\n");
}
}
Main.class
public class Main {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
舵主 总舵主 = new 舵主(舵主.总舵主);
舵主 分舵主1 = new 舵主(舵主.分舵主);
舵主 分舵主2 = new 舵主(舵主.分舵主);
总舵主.增加成员(分舵主1);
总舵主.增加成员(new 左护法());
总舵主.增加成员(new 右护法());
分舵主1.增加成员(分舵主2);
分舵主1.增加成员(new 左护法());
分舵主1.增加成员(new 右护法());
分舵主2.增加成员(new 左护法());
分舵主2.增加成员(new 右护法());
总舵主.显示成员职能();
分舵主1.显示成员职能();
分舵主2.显示成员职能();
}
}
最后输出
我是总舵主
左护法保护舵主
右护法保护舵主
--------------
我是分舵主
左护法保护舵主
右护法保护舵主
--------------
我是分舵主
左护法保护舵主
右护法保护舵主
--------------