在面向对象系统中,我们常会遇到一类具有“容器”特征的对象
--即它们在充当对象的同时,又是其他对象的容器。
public class SingleBox:IBox
...{
public class process()
...{ .....}
}
public class ContainerBox:IBox
...{
public void process()
...{ ... }
public ArragList getBoxes()
...{ ...}
}
如果我们要对这样的对象容器进行处理:
class App
...{
public static void Main()
...{
IBox box=Factory.getBox();
//客户代码和对象内部结构发生了耦合
if(box is constrainerBox)
box.process();
ArryList list=((ConstrainerBox)box).GetBoxes();
....//
}else if( box is SingleBox)...{
box.process();
}
}
}
在用contrainBox 必须知道对象的结构,在复杂的情况还要在
客户端进行排序。
如果客户和业务对象最好直接和接口发生依赖---就是和IBox发生依赖
而我们的代码中客户和ConstrainerBox 发生依赖。。
这样就存在问题--业务发生变化客户就会不能运行
上述描述的问题根源在于:客户代码过多地依赖于对象容
器复杂的内部实现结构,对象容器内部实现结构(而非抽
象接口)的变化将引起客户代码的频繁变化,带来了代码
的维护性、扩展性等弊端。
如何将“客户代码与复杂的对象容器结构”解耦?让对象容器
自己来实现自身的复杂结构,从而使得客户代码就像处理
简单对象一样来处理复杂的对象容器?
原则: 接口最小化--就是业务对象有些方法是自己调用和客户端
调用,把客户调用方法在接口声明,就可以屏蔽那些自己调用的方法
意图(Intent)
将对象组合成树形结构以表示“部分-整体”的层次结构。
Composite使用户对单个对象和组合对象的使用具有一致性。
结构(struture)
pulic interface IBox
...{
void process();
void Remove(IBox box);
void Add(IBox box);
}
public class SingleBox:IBox
...{
public class process()
...{
//1. DO process for myself
....
}
public void Add(IBox box)
...{
throw new Exception("不能添加,我不是容器")
}
public void Remove(IBox box)
...{
throw new Exception("不能删除,我不是容器")
}
}
public class ConstrainerBox:IBox
...{
ArrayList list=null;
public void Add(IBox box)
...{
if(list==null)
list=new ArryList();
list.add(box)
}
public void Remove(IBox box)
...{
if(list!=null)
list.remove(box)
}
public void process()/**////树形结构出来了
...{
//1. DO process for myself
....
//2.Do process for the box in the list
if(lis!=null)
...{
foreach(IBox bos in list)
...{
box.Process();
}
}
}
}
class App
...{
public static void Main()
...{
IBox box=Factory.getBox();
box.process();//这样就可以个抽象接口发生耦合。
//也是我们要的
}
}
}
Composite模式的几个要点
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
composite在现实实现很都比如 菜单,panel--constrain Button--叶子接点