合成模式:描述整体与部分的关系,将对象组织到树结构中,最典型的是文件与文件夹系统,分为安全式与透明式。
例子:我家有座山,山下有个养牛场,牛分奶牛与黄牛,每头牛都有编号
安全式:
类图:
抽象构建角色 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("");
}
}