组合模式的定义:将对象表示 “部分---整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
大致意思就是这样,当我们有多个类型的对象,他们有共同点有不同点,并且所处的位置也不同,有的处在第一级,有的处在第二级,但是他们有些共同点,我们将他们都抽象成一种类型,这样对他们的使用将会有一致性。
打个比方:现在又商品,商品又分为商品种类和具体的商品,而商品种类下可能还有更细致的商品种类,那么这就是一个没有办法统计的问题了,有的时候一个商品是叶子,有的时候是树枝,有的时候还是根节点。如果我们对他们分别进行设计类,那么可以想见的是,类会相当复杂,实现也会变得很复杂。这个时候就能用到了组合模式,我们把所有公共信息都抽象出来。
package com.gengu.组合模式;
/**
* 抽象的商品类
* 规定了name 等内容
* */
public abstract class Good {
private String name;
public Good(String name){
this.name = name;
}
public String getInfo(){
StringBuilder a = new StringBuilder();
a.append("该商品的名字是:"+this.name);
return a.toString();
}
}
产品种类
package com.gengu.组合模式;
import java.util.ArrayList;
import java.util.List;
/**
* 商品种类
* 也即是我们说的树枝节点
* 有其他的叶子节点和树枝节点的存在
* */
public class GoodType extends Good{
public List<Good> lists = new ArrayList<Good>();
public GoodType(String name) {
super(name);
}
//增加他的节点
public void addGoods(Good good){
this.lists.add(good);
}
//我有哪些叶子节点
public List<Good> getMyBranch(){
return this.lists;
}
//打印我们的节点信息
public void printBranch(){
for(Good good:lists){
if(good instanceof ConcreteGood){
System.out.println(good.getInfo());
}else if(good instanceof GoodType){
System.out.println(good.getInfo());
((GoodType)good).printBranch();
}
}
}
}
具体商品类
package com.gengu.组合模式;
/**
* 叶子节点
* */
public class ConcreteGood extends Good{
public ConcreteGood(String name){
super(name);
}
}
场景类
package com.gengu.组合模式;
public class Client {
public static void main(String[] args) {
GoodType type1 = new GoodType("衣服");
GoodType type2 = new GoodType("毛衣");
GoodType type3 = new GoodType("衬衣");
Good good1 = new ConcreteGood("鄂尔多斯毛衣");
Good good2 = new ConcreteGood("七匹狼衬衣");
type2.addGoods(good1);
type3.addGoods(good2);
((GoodType) type1).addGoods(type2);
((GoodType) type1).addGoods(type3);
type1.printBranch();
}
}
通过以上的代码,我们的程序不管场景怎么变换,都能很好的扩展。
组合模式的有点:高层模块调用简单。
节点自由增加,非常容易扩展,横向扩展和纵向扩展都很方便,符合开闭原则,对以后的维护非常有利。
组合模式适合使用的地方有:树形菜单,文件和文件夹管理。