组合模式

组合模式的定义:将对象表示 “部分---整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

 

大致意思就是这样,当我们有多个类型的对象,他们有共同点有不同点,并且所处的位置也不同,有的处在第一级,有的处在第二级,但是他们有些共同点,我们将他们都抽象成一种类型,这样对他们的使用将会有一致性。

 

打个比方:现在又商品,商品又分为商品种类和具体的商品,而商品种类下可能还有更细致的商品种类,那么这就是一个没有办法统计的问题了,有的时候一个商品是叶子,有的时候是树枝,有的时候还是根节点。如果我们对他们分别进行设计类,那么可以想见的是,类会相当复杂,实现也会变得很复杂。这个时候就能用到了组合模式,我们把所有公共信息都抽象出来。

 

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();
    }
}

 通过以上的代码,我们的程序不管场景怎么变换,都能很好的扩展。

 

组合模式的有点:高层模块调用简单。

节点自由增加,非常容易扩展,横向扩展和纵向扩展都很方便,符合开闭原则,对以后的维护非常有利。

 

组合模式适合使用的地方有:树形菜单,文件和文件夹管理。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值