组合模式:组合多个对象形成树形结构以表示有整体-部分关系层次结构,组合模式可以让客户端统一对待单个对象和组合对象
component (抽象构件:容器):它可以是接口或者抽象类,为叶子构建和子容器构建对象声明接口,在该角色中可以包含所有子类共有的行为的实现和声明。在抽象构建中定义了访问及管理它的子构件的方法,如增加子构件,删除子构件,获取子构件等。
leaf(叶子构建):叶子构建可以说就是各种类型的文件!叶子构建没有子构件。它实现了抽象构建中的定义的行为。对于那些访问子容器,删除子容器,增加子容器的就报错。
compsite(子容器构建):它在组合模式中表示容器节点对象,容器结点是子节点,可以是子容器,也可以是叶子构建,它提供一个集合来存储子节点。
组合模式的简单实现
component
public abstract class Component{
//这个是容器类的抽象类,定义好行为,定义创建移除子容器的方法抽象的。
public abstract void addComposite(Component c); //添加成员
public abstract void removeComposite(Component c);//移除成员
public abstract Component getComposite(int i);//获取子容器
public abstract void operation();//业务方法
}
leaf
public class Leaf extends Component{
//首先重写component的方法
//叶子节点关键点在于业务
public void Operation(){
System.out.print("业务方法");
}
public void addComponent(Component c){
//提示报错呗 。
System.out.print("不是子容器");
}
public void removeComponent(Component c){
//提示报错呗 。
System.out.print("不是子容器");
}
public Component addComponent(int c){
//提示报错呗 。
System.out.print("不是子容器");
return null;
}
}
composite
public class Composite extends Component{
//首先来一个存储的集合
private ArrayList<Component> list = new ArrayList<Component> ;
public void addComponent(Component c){
list.add(c);
}
public void removeComponent(Component c){
list.remove(c);
}
public Component getComponent(int c){
Component c1 =list.get(c);
return c1;
}
public void operation(){
for(Object obj:list){
((Component)obj).operation();
}
}
}
组合模式的正式例子
杀毒软件,该软件能够对某个文件夹杀毒,也可以指定对某些文件杀毒。
AbstractFile: 抽象文件类,充当抽象构建
public abstract class AbstractFiles {
public abstract void add(AbstractFiles af);
public abstract void remove(AbstractFiles af);
public abstract AbstractFiles get(int i);
public abstract void killVirus();
}
叶子节点:文件类型,就写了一种
public class ImageFile extends AbstractFiles {
private String name;
public ImageFile(String name) {
this.name=name;
}
@Override
public void add(AbstractFiles af) {
// TODO Auto-generated method stub
System.out.println("不支持该方法");
}
@Override
public void remove(AbstractFiles af) {
// TODO Auto-generated method stub
System.out.println("不支持该方法");
}
@Override
public AbstractFiles get(int i) {
// TODO Auto-generated method stub
System.out.println("不支持该方法");
return null;
}
@Override
public void killVirus() {
// TODO Auto-generated method stub
System.out.println("开始进行--"+name+"--文件杀毒");
}
}
文件类型:
public class Folder extends AbstractFiles {
//文件夹类,所有的都可以用
private ArrayList<AbstractFiles> list = new ArrayList<AbstractFiles>();
private String name;
public Folder(String name) {
this.name=name;
}
@Override
public void add(AbstractFiles af) {
list.add(af);
System.out.println("添加成狗");
}
@Override
public void remove(AbstractFiles af) {
// TODO Auto-generated method stub
if(list.remove(af)) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
}
@Override
public AbstractFiles get(int i) {
// TODO Auto-generated method stub
return list.get(i);
}
@Override
public void killVirus() {
// TODO Auto-generated method stub
System.out.println("对文件夹"+name+"进行杀毒");
//递归调用
for(Object o:list) {
((AbstractFiles)o).killVirus();
}
}
}
测试:
public class Client {
public static void main(String[] args) {
//创建一个文件类型
AbstractFiles f1 = new Folder("主文件夹");
//创建文件
AbstractFiles file1= new ImageFile("孙悟空.png");
AbstractFiles file2= new ImageFile("龙珠.jpg");
AbstractFiles file3= new ImageFile("帅哥威.gif");
f1.add(file1);
f1.add(file2);
f1.add(file3);
f1.killVirus();
file1.killVirus();
}
}