8.设计模式之组合模式

先看一下结构图


 

2. 如果把Composite模式看成是树形结构的话,那么它主要角色有:

 

  1)抽象构件角色(Component):该角色是一个抽象类,它定义了一些操作增删树叶(Leaf)的操作。

 

  2)树枝构件角色(Composite):树枝上有很多树干,树枝也是树干的一种。

 

  3)树叶构件角色(Leaf):  树枝上的树叶,也就是Component中的具体操作对象【注意没有,因为处在最末端     所有没有add和remove方法】

 3. 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性【我觉得此处要重点理解,但是,我还没有完全理解】

 

好吧,上代码。

example: 某网刊有体育模块和国内新闻模块,体育模块下有CBA和NBA网站;国内新闻模块有上海地区新闻和江苏地区新闻

 

package designpattern.composite;

/**
 * 
 * 定义一个抽象树干类
 * 
 * @author king
 *
 */
public abstract class Component {

	public String name;//组件的名字
	public Component(String name){
		this.name=name;
	}
	//加入组件
	abstract void add(Component component);
	//删除组件
	abstract void remove(Component component);
	//组件方法
	abstract void operation(Component component);
	
}

 

 

package designpattern.composite;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * 树枝角色类
 * 
 * @author king
 *
 */
public class Composite extends Component{

	private List<Component> components = null;
	
	public Composite(String name) {
		super(name);
		components = new ArrayList<Component>();
	}
	
	void add(Component component) {
		components.add(component);
	}

	void remove(Component component) {
		components.remove(component);
	}
	
	//就实现一个打印功能
	void operation(Component component) {
		//枝干节点主要输出自己和自己的子结点
		System.out.println(this.name);
		//如果存在枝节点,则打印枝节点
		for(Component c : components){  
			//递归输出每个子对象  
			 System.out.print("\t");
			 c.operation(c);  
		}
	}
}

 

 

package designpattern.composite;


/**
 * 
 * 叶子角色类
 * 
 * @author king
 *
 */
public class Leaf extends Component {

	public Leaf(String name) {
		super(name);
	}
	void add(Component component) {
		throw new UnsupportedOperationException("叶子角色类不支持这个功能");  
	}

	void remove(Component component) {
		throw new UnsupportedOperationException("叶子角色类不支持这个功能"); 
	}

	//就实现一个打印功能
	void operation(Component component) {
		//叶子结点只要输出自己
		System.out.println("\t"+this.name);
	}

}

 

 

package designpattern.composite;

public class Client {
	public static void main(String[] args) {
		
		Component newsRoot = new Composite("新闻");
		
		Component sportsNews = new Composite("体育新闻");
		
		Component nbaNews = new Leaf("NBA");
		
		Component cbaNews = new Leaf("CBA");
		
		Component nationalNews = new Composite("国内新闻");
		
		Component shanghaiNews = new Leaf("上海");
		
		Component jiangsuNews = new Leaf("江苏");
		
		sportsNews.add(nbaNews);
		sportsNews.add(cbaNews);
		
		nationalNews.add(shanghaiNews);
		nationalNews.add(jiangsuNews);
		newsRoot.add(nationalNews);
		newsRoot.add(sportsNews);
		
		newsRoot.operation(newsRoot);
		
	}

}

 

代码写的比较匆忙,有些地方没有添加注释,抽时间补上吧。

设计模式,任重道远啊。

 

 

返回导航

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值