合成模式(Composite)-山下的养牛场

合成模式:描述整体与部分的关系,将对象组织到树结构中,最典型的是文件与文件夹系统,分为安全式与透明式。

例子:我家有座山,山下有个养牛场,牛分奶牛与黄牛,每头牛都有编号

安全式:

类图:


抽象构建角色 Cattle类

package composite2;

/**
 * 合成模式  安全模式
 * 山下牛场里的牛群图
 * 抽象构建牛
 * @author wang
 *
 */
public interface Cattle {

	public void recordNo(String no);
	
}

树枝构建角色 BranchCattle

package composite2;

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

/**
 * 树枝构建牛
 * 树枝构建类给出 addChild() removeChild() getChild() 等方法的声明与实现
 * @author wang
 *
 */
public class BranchCattle implements Cattle{
   
	private List<Cattle> childCattle = new ArrayList<Cattle>();
	
	private String name;
	
	public BranchCattle(String name){
		this.name = name;
	}
	
	public void addChild(Cattle child){
		childCattle.add(child);
	}
	
	public void removeChild(Cattle child){
		childCattle.remove(child);
	}
	
	public List<Cattle> getChild(){
		return childCattle;
	}
	
	public void recordNo(String no){
		System.out.println(no + "+" + this.name);
		if(this.childCattle != null){
			no += "  ";
		   for(Cattle c : childCattle){
			   c.recordNo(no);
		   }
		}
	}
}

叶子构建角色 LeafCattle

package composite2;

/**
 * 树叶构建牛
 * 树叶构建类没有给出 addChild() removeChild() getChild() 方法的声明与实现
 * @author wang
 *
 */
public class LeafCattle implements Cattle{

	private String name;
	
	public LeafCattle(String name){
		this.name = name;
	}
	
	public void recordNo(String no){
		System.out.println(no + "-" + name);
	}
}

测试类:

package composite2;

public class Client {

	public static void main(String args[]){
		BranchCattle root = new BranchCattle("牛群");
		BranchCattle c1 = new BranchCattle("奶牛");
		BranchCattle c2 = new BranchCattle("黄牛");
		
		LeafCattle b1 = new LeafCattle("1号奶牛");
		LeafCattle b2 = new LeafCattle("2号奶牛");
		LeafCattle b3 = new LeafCattle("1号黄牛");
		LeafCattle b4 = new LeafCattle("2号黄牛");
		
		root.addChild(c1);
		root.addChild(c2);
		c1.addChild(b1);
		c1.addChild(b2);
		c2.addChild(b3);
		c2.addChild(b4);

		root.recordNo("");
	}
	
}



透明式

类图


程序代码:

抽象构建角色: Cattle类

package composite3;

import java.util.List;

public abstract class Cattle {

	public abstract void recordNo(String no);
	
	public void addChild(Cattle child){
		throw new UnsupportedOperationException("抽象方法");
	}
	
	public void removeChild(Cattle child){
		throw new UnsupportedOperationException("抽象方法");
	}
	
	public List<Cattle> getChild(){
		throw new UnsupportedOperationException("抽象方法");
	}
}

树枝构建角色:BranchCattle类

package composite3;

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

public class BranchCattle extends Cattle{

	private List<Cattle> cattleChild = new ArrayList<Cattle>();
	
	private String name;
	
	public BranchCattle(String name){
		this.name = name;
	}
	
	public void addChild(Cattle child){
		cattleChild.add(child);
	}
	
	public void removeChild(Cattle child){
		cattleChild.remove(child);
	}
	
	public List<Cattle> getChild(){
		return cattleChild;
	}
	
	public void recordNo(String no){
		System.out.println(no + "+" + this.name);
		if(this.getChild() != null){
			no += "  ";
			for(Cattle c : cattleChild){
				c.recordNo(no);
			}
		}
	}
	
}
树叶构建角色: LeafCattle类

package composite3;

public class LeafCattle extends Cattle{

	private String name;
	
	public LeafCattle(String name){
		this.name = name;
	}
	
	public void recordNo(String no){
		System.out.println(no + "-" + name);
	}
}

测试类

package composite3;

public class Client {

	public static void main(String[] args){
	   Cattle root = new BranchCattle("牛群");
	   Cattle c1 = new BranchCattle("奶牛");
	   Cattle c2 = new BranchCattle("黄牛");
	   
	   Cattle b1 = new LeafCattle("1号奶牛");
	   Cattle b2 = new LeafCattle("2号奶牛");
	   Cattle b3 = new LeafCattle("1号黄牛");
	   Cattle b4 = new LeafCattle("2号黄牛");
	   
	   root.addChild(c1);
	   root.addChild(c2);
	   c1.addChild(b1);
	   c1.addChild(b2);
	   c2.addChild(b3);
	   c2.addChild(b4);
	   
	   root.recordNo("");
	}
	
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值