今天看了一下组合模式的设计 了解了一下组合模式到底是用来干什么的
我们直接开始
component (抽象构件:容器):它可以是接口或者抽象类,为叶子构建和子容器构建对象声明接口,在该角色中可以包含所有子类共有的行为的实现和声明。在抽象构建中定义了访问及管理它的子构件的方法,如增加子构件,删除子构件,获取子构件等。
compsite(子容器构建):它在组合模式中表示容器节点对象,容器结点是子节点,可以是子容器,也可以是叶子构建,它提供一个集合来存储子节点。
leaf(叶子构建):叶子构建没有子构件。它实现了抽象构建中的定义的行为。对于那些访问子容器,删除子容器,增加子容器的就报错。
放到一个文件夹的案例来说: component 就是一个抽象类 它定义了我们需要的一些必要的方法
compsite就是一个文件夹
leaf就是各种类型的文件它下面不会有子节点了
但是我们想一想组合模式到底帮我们干了什么事情喃 如果我们用需要用到树形结构来做一些处理的时候
那么我们做任何处理的时候都需要递归调用一些东西 而且文件和文件夹由于两种功能的不同他们可能会做不同的处理 并且可能会很麻烦 组合模式帮我们轻松的解决了这个问题 大家想一想 如果我们想对文件夹中的某一个文件进行处理的时候 我们需要写递归函数来调用整个树 但是通过组合模式 我们只需要在最高文件夹调用一下它的Operation方法就行了
下面是一个文件树通过组合模式来实现的代码
public abstract class Component {
//文件名
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//删除文件
public abstract void removeFile(Component omponent);
//添加子文件或者叶子节点
public abstract void addFile(Component omponent);
//获取子文件夹或者叶子节点
public abstract Component getFile(String filename);
//业务的处理
public abstract void operation();
}
import java.util.ArrayList;
import java.util.List;
public class Composite extends Component{
//该文件夹下的文件
private List<Component> components=new ArrayList();
public Composite(String name) {
this.name = name;
}
//文件名 能够唯一标志该文件的
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void removeFile(Component omponent) {
boolean flag=components.remove(omponent);
if(flag){
System.out.println("删除成功");
}else{
System.out.println("没有该文件");
}
}
@Override
public void addFile(Component component) {
components.add(component);
System.out.println("添加文件"+component.getName()+"成功");
}
@Override
public Component getFile(String filename) {
for(Component component:components){
if(component.getName().equals(filename)){
System.out.println("获取文件"+component.getName()+"成功");
return component;
}
}
return null;
}
@Override
public void operation() {
System.out.println("对文件夹"+name+"进行杀毒操作");
for(Component component:components){
component.operation();//子文件进行操作
}
}
}
public class Leaf extends Component{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Leaf(String name) {
super();
this.name = name;
}
@Override
public void removeFile(Component omponent) {
// TODO Auto-generated method stub
System.out.println("无法对该文件进行操作");
}
@Override
public void addFile(Component omponent) {
// TODO Auto-generated method stub
System.out.println("无法对该文件进行操作");
}
@Override
public Component getFile(String filename) {
// TODO Auto-generated method stub
System.out.println("无法对该文件进行操作");
return null;
}
@Override
public void operation() {
// TODO Auto-generated method stub
System.out.println("对文件"+name+"进行杀毒操作");
}
}
public class Main {
public static void main(String[] args){
Composite composite1=new Composite("java");
Composite composite2=new Composite("设计模式");
composite1.addFile(composite2);//将jdk添加到java文件夹下
composite1.addFile(new Leaf("java基础"));//在java文件夹下添加java基础文件
composite1.getFile("设计模式").addFile(new Leaf("组合模式"));//在java文件夹下的jdk文件夹下面添加一个组合模式的问价
composite1.operation();
}
}
结果