设计模式之组合模式

一情景

     最近电脑d盘里面的东西都满了 ,需要整理一下,该清除的要清除掉,该留的要留着,所以对于d盘里面的目录和文件要一层层的整理,我们清理的前提是不删除文件目录的前提下,先来看根目录d盘,根目录如下

d盘文件夹



根目录下有两个文件data.csv和wine.data.csv,还有两个文件夹tmp和ssi,tmp下有一个文件图像.bmp


ssi文件下面有两个文件工作表.xlsx和日程.xlsx


       如果按照正常的步骤我们要先遍历d盘,在d盘下的两个文件data.csv和wine.data.csv,因为这两个文件不是文件不是目录可以直接删除,还有两个文件夹目录tmp和ssi。对于这两个文件夹目录,我们只能再分别对它们进行遍历,如果发现他们两个文件目录下面还有文件直接删除,如果还有文件夹目录接着在分别遍历,一直重复上面的动作,知道最底层不存在文件夹目录。像这样假设d盘下有很多文件夹目录,这些文件夹目录下面还有文件目录,或许有的文件夹目录层次很深,如果手动去干的话,估计要疯掉吧!那么我们只能另想他法了!翻看gof,有一种模式能帮我解决这个问题,这个模式叫做组合模式。

二组合模式

    组合模式:将对象组合成树形结构以表示部分-整体的层次结构,组合模式使得单个对象和组合对象具有一致性。

     看上面的例子一个d盘里面包含了两个文件data.csv和wine.data.csv还有两个文件夹ssi和tmp,我们可以这么理解把这四个文件组合成d盘的结构,而ssi 和d盘下面还有其他的几个文件,他们分别组合成ssi和tmp的文件夹结构。这种数据结构看起来就像树一样,d盘就像树的主干,data.csv和wine.data.csv像主干的树叶,ssi和tmp像主干的树枝,组合成si和tmp的文件就像ssi和tmp的树叶。而组合模式处理的思想是这样的:可以把文件看成是基本的元素对象,把文件夹目录看成复杂的对象,基本的对象组合成复杂的对象,复杂的对象还可以组合成更复杂的对象,这样一层层的递归。这样用户在任何使用基本对象的时候都可以使用复杂对象,用户在根本不用考虑处理的是叶子节点还是树枝节点。简单点就是说用户可以一致的对待使用简单对象和组合对象。


                                                            

   

     d盘就像树主干,data.csv,wine.data.csv、是d盘的叶子,图像.bmp是tmp的叶子,工作表.xlsx、日程.xlsx是ssi的叶子,因为它们下面没有分支,把ssi和tmp是主干d盘的分枝,因为它们下面有分支。用代码来实现

首先得有一个抽象类来管理这些树枝和树叶

public     abstract   class Component {

public String  name;//不管是树枝还是树叶都有自己的名字

public Component(String name) {
this.name=name;
}
public abstract  void add(Component composite);//通常声明add 来添加树叶和树枝
public abstract  void remove(Component composite);;//通常声明remove 来移除树叶和树枝
public abstract  void clear();//不管是叶子和树枝都有清理的功能,树枝的清理功能就是清理这个树枝下面分支的功能

}

定义一个树枝,树枝肯定很多分支存储树叶或者是分支树枝

  public   class Composite extends Component{

public List<Component>  iList =new ArrayList<Component>();//树枝下面还有很多的分支树枝和叶子
public Composite(String name) {
super(name);
}
public void add(Component composite) {//添加树枝或者树叶

iList.add(composite);
}
public void remove(Component composite) {//移除树枝或者树叶
iList.remove(composite);

}
public void clear() {
System.out.println("--"+name);
while(iList.size()>0){//清理本树枝下的所有分支,不管是树叶还是树枝
Component c= (Component) iList.remove(0);
c.clear();
}
}

}


叶子节点,叶子其实就一个清理的功能,但是为了抽象我们也让他拥有和父类一样的增加add和remove方法,但是实际没啥意义

public   class Leaf extends Component{

public Leaf(String name) {
super(name);
}
public void add(Component composite) {

System.out.println("-");
}
public void remove(Component composite) {
System.out.println("-");

}
public void clear() {

System.out.println("--"+name);
}

}


客户端做清理工作

  Component d=new Composite("d盘");//主干目录
Component tmp= new Composite("tmp") ;//主干目录下分的树枝节点
Component ssi= new Composite("ssi") ;
Component l1= new Leaf("data.csv") ;//主干录下分的树叶节点
Component l2= new Leaf("wine.data.csv") ;
Component l3= new Leaf("图像.bmp") ;
Component l4= new Leaf("工作表.xlsx") ;
Component l5= new Leaf("日程.xlsx") ;
d.add(l1);//主干目录下的叶子文件
d.add(l2);//主干目录下的叶子文件
tmp.add(l3);//树枝tmp下的树叶节点
d.add(tmp);//树枝tmp属于主干目录
ssi.add(l4);//树枝ssi下的树叶节点
ssi.add(l5);//树枝ssi下的树叶节点

d.add(ssi);//树枝ssi属于主干目录

d.clear();//同意处理,处理的时候不要考虑是不是叶子还是树枝

    看完代码,还有很重要的一点理解就是,组合模式可以让客户一致的对待单个对象和组合对象。看客户端代码,如果你觉得这棵树只有叶子,你就只需要定义叶子类类,当然如果你觉得这可树有很多分支类,分支类下还有很多分支类。那你就定义基本树枝类,用树枝类组合成复杂的树枝类。在客户端发现不管是定义树枝还是树叶他们的方式和行为都基本一样。这是我对组合模式的理解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值