设计模式之组合模式_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 设计模式之组合模式

设计模式之组合模式

 2013/8/21 0:48:52  wangkechao.dream  程序员俱乐部  我要评论(0)
  • 摘要:先看一下结构图2.如果把Composite模式看成是树形结构的话,那么它主要角色有:1)抽象构件角色(Component):该角色是一个抽象类,它定义了一些操作增删树叶(Leaf)的操作。2)树枝构件角色(Composite):树枝上有很多树干,树枝也是树干的一种。3)树叶构件角色(Leaf):树枝上的树叶,也就是Component中的具体操作对象【注意没有,因为处在最末端所有没有add和remove方法】3.组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构
  • 标签:模式 设计 设计模式

先看一下结构图


?

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

?

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

?

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

?

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

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

?

好吧,上代码。

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

?

class="java" name="code">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);
		
	}

}

?

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

设计模式任重道远啊。

?

?

返回导航

  • 大小: 5.2 KB
  • 查看图片附件
发表评论
用户名: 匿名