设计模式(九)---组合模式

将对象组合成树形结构以表示"部分-整体"的层次结构。
"Composite使得用户对单个对象和组合对*的使用具有一致性。"

组合模式个人理解就是在共同的父类或抽象类中定义一个容器,
这个容器的对象类型还是本身,并定义容器的维护方法。
这种结构很像树结构。理解成树结构就没什么好说的了。

下面给出例子:

package test.design.composite.one;

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

/**
 * 员工类
 * 定义组合对象的类型
 * 
 * @author lushuaiyin
 *
 */
public abstract class Staff {
	public Staff(){}
	public Staff(String name){
		this.name=name;
	}
	
	private String name;//员工名称
	public List<Staff> subordinate=new ArrayList<Staff>();//下属(composite容器)
	/*
	 这里必须定义一个composite对象,其实就是一个容器,它里面对象类型是自己本身。
	 这就是组合的关键。继承这个类的所有对象都可以在这个容器中装同类对象,达到组合
	 的效果。这种结构其实很像树结构,不过比树结构还要简单,它只是提供了子节点容器和
	 维护方法而已。说到这里,我们认为树结构就是组合模式的具体实现。那么同样,在实际中
	 我们遇到树结构的数据类型,就可以考虑组合模式,实际上我们也是这么做的,可能在做的时候
	 还不知道这叫组合模式。
	 */
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	/*
	 既然定义了容器,就 必须定义容器的业务维护方法。
	 容器有自己的怎删改查方法,我们还需要根据业务把需要的维护定义成方法。
	 比如这个下属员工的容器,需要增加员工,删除员工等
	 */
	public List<Staff> getSubordinate() {//获取下属员工
		return subordinate;
	}

	public void addSubordinate(Staff subordinate) {//增加下属
		this.subordinate.add(subordinate);
	}
	public void addSubordinateList(List<Staff> subordinateList) {//增加下属
		this.subordinate.addAll(subordinateList);
	}
	
	public void delSubordinate(Staff subordinate){//删除下属
		if(subordinate!=null){
			if(this.subordinate.contains(subordinate)){
				this.subordinate.remove(subordinate);
			}
		}
	}
	
	public abstract void work();//业务抽象 
	
	public void printSubordinateInfo(){
		System.out.println("--------------------------------------");
		if(this.subordinate==null||this.subordinate.size()==0){
			System.out.println(this.getName()+" 没有下属员工。");
		}else{
			String info=this.getName()+"的下属员工有:\r\n";
			for(int i=0;i<this.subordinate.size();i++){
				Staff s=(Staff)this.subordinate.get(i);
				if(s!=null&&s.getName()!=null){
					if(i==this.subordinate.size()-1){
						info+=s.getName();
					}else{
						info+=s.getName()+",";
					}
					
				}
				
			}//end for
			System.out.println(info);
		}
		System.out.println("--------------------------------------");
	}
	

	
}


 

package test.design.composite.one;

public class ProjectManager extends Staff{
	public ProjectManager(){}
	public ProjectManager(String name){
		super(name);
	}
	
	@Override
	public void work() {
		System.out.println("I am ProjectManager,my name is "+this.getName()+".I control the project.");
	}
}


 

package test.design.composite.one;

/**
 * 程序员
 * @author lushuaiyin
 *
 */
public class Programmer extends Staff{
	public Programmer(){}
	public Programmer(String name){
		super(name);
	}
	@Override
	public void work() {
		System.out.println("I am Programmer,my name is "+this.getName()+".I work always.");
	}
}


 

package test.design.composite.one;


/**
 * 客户端测试
 * @author lushuaiyin
 *
 */
public class TestMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Staff c=new CTO("CTO_one");
		
		System.out.println(c instanceof Staff);
		
		ProjectManager pm1=new ProjectManager("ProjectManager_p1");
		Staff pm2=new ProjectManager("ProjectManager_p2");
		
		Staff kubi1=new Programmer("程1");
		Staff kubi2=new Programmer("程2");
		Programmer kubi3=new Programmer("程3");
		
		//组合
		c.addSubordinate(pm1);
		c.addSubordinate(pm2);
		
		pm1.addSubordinate(kubi1);
		pm1.addSubordinate(kubi2);
		
		pm2.addSubordinate(kubi3);
		
		
		//打印
		c.printSubordinateInfo();
		pm1.printSubordinateInfo();
		pm2.printSubordinateInfo();
		
		kubi1.printSubordinateInfo();
		kubi2.printSubordinateInfo();
		kubi3.printSubordinateInfo();
		
		
		//业务
		c.work();
		pm1.work();
		pm2.work();
		kubi1.work();
		kubi2.work();
		kubi3.work();
		
		
		//测试组合方法
		pm1.delSubordinate(kubi1);
		pm1.printSubordinateInfo();
		
		pm2.addSubordinate(kubi1);
		pm2.printSubordinateInfo();
	}

}


打印:
true
--------------------------------------
CTO_one的下属员工有:
ProjectManager_p1,ProjectManager_p2
--------------------------------------
--------------------------------------
ProjectManager_p1的下属员工有:
程1,程2
--------------------------------------
--------------------------------------
ProjectManager_p2的下属员工有:
程3
--------------------------------------
--------------------------------------
程1 没有下属员工。
--------------------------------------
--------------------------------------
程2 没有下属员工。
--------------------------------------
--------------------------------------
程3 没有下属员工。
--------------------------------------
I am CTO,my name is CTO_one.I control the whole thing.
I am ProjectManager,my name is ProjectManager_p1.I control the project.
I am ProjectManager,my name is ProjectManager_p2.I control the project.
I am Programmer,my name is 程1.I work always.
I am Programmer,my name is 程2.I work always.
I am Programmer,my name is 程3.I work always.
--------------------------------------
ProjectManager_p1的下属员工有:
程2
--------------------------------------
--------------------------------------
ProjectManager_p2的下属员工有:
程3,程1
--------------------------------------

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值