一、定义:
将对象组合成树形结构以表示“部分——整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
二、组成角色:
1、抽象构件角色Component:给参与组合的对象规定一个接口。
2、树叶构件角色Leaf:没有子对象的对象
3、 树枝构件角色Composite:有子对象的对象
三、使用场景:
1、需求中体现部分与整体层次的结构;
2、希望用户忽略组合对象和单个对象的不同,统一的使用组合结构中的所有对象。
四、具体分类:(不太理解)
1、透明方式:在Component中声明所有管理子类的方法。
2、安全方式:,,,,,
优缺点:,,,,,,,,
五、组合模式优缺点:
主要优点:统一了组合对象和叶子对象
六、通用代码&&PPT服装管理例子:
//抽象构件角色:定义接口
public abstract class Component {
protected String name;
public Component(String name) {
this.name=name;
}
public abstract void add(Component c);
public abstract void remove(Component c);
public abstract void display(int depth);
}
//树枝构件角色
import java.util.ArrayList;
import java.util.List;
public class Composite extends Component {
private List<Component> list=new ArrayList<Component>();
public Composite(String name) {
super(name);
}
@Override
public void add(Component c) {
list.add(c);
}
@Override
public void remove(Component c) {
list.remove(c);
}
@Override
public void display(int depth) {
for(int i=1;i<=depth;++i)System.out.print("-");
System.out.println(name);
for(Component c:list)c.display(depth+4);
}
}
//树叶构件角色
public class Leaf extends Component{
public Leaf(String name) {
super(name);
}
@Override
public void add(Component c) {
System.out.println("不能添加");
}
@Override
public void remove(Component c) {
System.out.println("不能删除");
}
@Override
public void display(int depth) {
for(int i=1;i<=depth;++i)System.out.print("-");
System.out.println(name);
}
}
//客户端
package 组合模式;
public class Client {
public static void main(String[] args) {
Component c=new Composite("服装");
Component c1=new Composite("男装");
Component c2=new Composite("女装");
Component l1=new Leaf("体恤");
Component l2=new Leaf("裙子");
Component l3=new Leaf("校服");
c.add(c1);
c.add(c2);
c.add(l3);
c1.add(l1);
c1.add(l3);
c1.add(l2);
c2.add(l1);
c2.add(l2);
c2.add(l3);
c.display(1);
c1.remove(l2);
c.display(1);
}
}
运行结果:
实例(图形应用程序)
UML图:
//抽象构件角色
public abstract class Graphic {
public abstract void draw();
public abstract void add(Graphic g);
public abstract void remove(Graphic g);
public abstract Graphic getChild(int index);
}
//叶子构件角色
public class Line extends Graphic {
@Override
public void draw() {
System.out.println("画出一条线");
}
@Override
public void add(Graphic g) {
System.out.println("不能再添加组件");
}
@Override
public void remove(Graphic g) {
System.out.println("不能移除任何组件");
}
@Override
public Graphic getChild(int index) {
return null;
}
}
//叶子构件角色
public class Rectangle extends Graphic {
@Override
public void draw() {
System.out.println("画矩形");
}
@Override
public void add(Graphic g) {
System.out.println("no 矩形!");
}
@Override
public void remove(Graphic g) {
System.out.println("no remove!");
}
@Override
public Graphic getChild(int index) {
return null;
}
}
//叶子构件角色
public class Text extends Graphic {
@Override
public void draw() {
System.out.println("画一个文本框");
}
@Override
public void add(Graphic g) {
System.out.println("no add");
}
@Override
public void remove(Graphic g) {
System.out.println("no remove");
}
@Override
public Graphic getChild(int index) {
return null;
}
}
//树枝构件角色
import java.util.*;
public class Picture extends Graphic {
private List<Graphic> list=new ArrayList<Graphic>();
@Override
public void draw() {
System.out.println("做一张图片!");
for(Graphic g:list)g.draw();
}
@Override
public void add(Graphic g) {
list.add(g);
}
@Override
public void remove(Graphic g) {
list.remove(g);
}
@Override
public Graphic getChild(int index) {
if(index-1>=0&&index-1<=list.size())return list.get(index+1);
else return null;
}
}
package 图形应用程序;
//客户端
public class Cilent {
public static void main(String[] args) {
Graphic p=new Picture();
System.out.println("第1张:");
Graphic a1=new Line();
Graphic a2=new Rectangle();
Graphic a3=new Text();
p.add(a1);
p.add(a2);
p.add(a3);
p.draw();
Graphic p2=new Picture();
p2.add(a1);
p2.add(a2);
System.out.println("第2张:");
p.add(p2);
p.draw();
System.out.println();
System.out.println("子部件");
Graphic gg=p.getChild(2);
gg.draw();
}
}
The end;