设计模式学习笔记之组合模式

本文介绍了一种软件设计模式——组合模式,通过示例详细解释了如何使用该模式来表示部分与整体的关系,使得用户可以一致地操作单个对象和对象组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所谓组合模式,即反映部分与整体的关系。使得用户按照同样的方式操作单个对象和对象组合。

举个例子:我们要实现一棵树,那么这棵树就是整体,而树又是又子树构成,子树又由子子树构成。那么树中的两大部分:1.叶子节点 2.子树,即节点的集合。

我们可以知道,对于子树而言,应该有添加功能(增加一个节点),删除功能(删除一个节点),以及显示功能(方便测试)。那么对于叶子节点而言,我们也为它上这三个功能,虽然叶子节点没有add和remove,但是为了保持与子树(节点集合)代码的一致性,我们也让它拥有这三个方法。所以子树和叶子节点,都继承至一个抽象类Component,这个抽象类定义了这三个方法:add、remove和display。

Component是个抽象类,代码如下:

package com.SmsTest.Test;
/*
 * author:Tammy Pi
 * function:组合模式的抽象类
 */
public abstract class Component {

	public void addComponent(Component comp) {
	}
	
	public void removeComponent(Component comp){
	}
	
	public void displayComponent(){}
}

而Leaf类继承至Component类,其addComponent方法和removeComponent方法没用,只是用于保持一致:

package com.SmsTest.Test;
/*
 * author:Tammy Pi
 * function:组合模式的叶子节点
 */
public class Leaf extends Component{

	private String name;
	
	public Leaf(String name){
		
		this.name = name;
	}
	
	//叶子节点不具有添加的功能
	public void addComponent(Component cmp){
		
		System.out.println("叶子节点不具有添加的功能!");
	}
	
	//叶子节点不具有移除的功能
	public void removeComponent(Component cmp){
		
		System.out.println("叶子节点不具有移除的功能!");
	}
	
	//显示
	public void displayComponent(){
		
		System.out.println(this.name);
	}
}

再就是集合类,包括Component的集合:

package com.SmsTest.Test;
import java.util.*;
/*
 * author:Tammy Pi
 * function:组合模式的组合对象
 */
public class Composite extends Component{

	private List<Component> list = new ArrayList<Component>();
	private String name;
	
	public Composite(String name){
		
		this.name = name;
	}
	
	public void addComponent(Component comp) {
		
		list.add(comp);
	}
	
	public void removeComponent(Component comp){
		
		list.remove(comp);
	}
	
	public void displayComponent(){
		
		System.out.println(this.name);
		
		for(int i=0;i<list.size();i++){
			
			System.out.print("--");
			list.get(i).displayComponent();
		}
	}
}

最后就是对组合模式的测试:

package com.SmsTest.Test;

public class TestComposite {

	public static void main(String[] args){
		
		Component root = new Composite("树根");
		Component lroot = new Composite("左子树");
		Component rroot = new Composite("右子树");
		
		Component lLeaf1 = new Leaf("左子树叶子节点1");
		Component lLeaf2 = new Leaf("左子树叶子节点2");
		Component rLeaf1 = new Leaf("右子树叶子节点1");
		Component rLeaf2 = new Leaf("右子树叶子节点2");
		
		lroot.addComponent(lLeaf1);
		lroot.addComponent(lLeaf2);
		rroot.addComponent(rLeaf1);
		rroot.addComponent(rLeaf2);
		
		root.addComponent(lroot);
		root.addComponent(rroot);
		
		root.displayComponent();
	}
}

 

结果如下:

树根
--左子树
--左子树叶子节点1
--左子树叶子节点2
--右子树
--右子树叶子节点1
--右子树叶子节点2

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值