设计模式|组合模式

组合模式
在这里插入图片描述
package computer;

import java.util.ArrayList;

public class Test {
public static void main(String[] args) {
//生成树根,树根上长出两个树叶
Composite composite=new Composite(“root”);
composite.add(new Leaf(“LeafA”));
composite.add(new Leaf(“LeafB”));

	//树根上长出分支,分支上有两片叶子
	Composite c1=new Composite("CompositeX");
	c1.add(new Leaf("LeafAx"));
	c1.add(new Leaf("LeafBx"));
	composite.add(c1);
	
	//分支CompositeX上长出一分支,分支上有两叶
	Composite c2=new Composite("CompositeY");
	c2.add(new Leaf("LeafAxY"));
	c2.add(new Leaf("LeafBxY"));
	c1.add(c2);
	
	//根部长出叶子
	composite.add(new Leaf("LeafC"));
	
	//根部掉落叶子
	Leaf leafd=new Leaf("LeafD");
	composite.add(leafd);
	composite.remove(leafd);
	
	//显示
	composite.printStruct(0);
}

}

//抽象基类
abstract class Component{
protected String name;
public Component(String name) {
this.name=name;
}
//添加
public abstract void add(Component component);
//删除
public abstract void remove(Component component);
//输出
public abstract void printStruct(int d);
}

//叶子类
class Leaf extends Component{

public Leaf(String name) {
	super(name);
}

public void add(Component component) {
	System.out.println("不能添加分支!");
}

public void remove(Component component) {
	System.out.println("不能删除分支!");
}

//显示
public void printStruct(int d) {
	for(int i=0;i<d;i++) {
		System.out.print(" ");
	}
	System.out.println("-"+name);
}

}

//有枝节点
class Composite extends Component{

//下层节点或叶子
private ArrayList<Component> components=new ArrayList<Component>();

public Composite(String name) {
	super(name);
}

public void add(Component component) {
	components.add(component);
}

public void remove(Component component) {
	components.remove(component);
}

//显示
public void printStruct(int d) {
	for(int i=0;i<d;i++) {
		System.out.print(" ");
	}
	System.out.println("+"+name);
	for(Component component:components) {
		component.printStruct(d+2);
	}
}

}
商品类别树

+服装
+男装
-衬衣
-夹克
+女装
-裙子
-套装

特点:
1、有一个根节点
2、树枝节点
3、叶子结点
根节点和树枝节点都可以包含其他节点,统称为容器节点。
现在需要管理商品类别树,假设要求能实现输出如上商品类别树的结构功能,应该如何实现?

一.不带模式的解决方案:组合对象
import java.util.ArrayList;
import java.util.Collection;

class Leaf{
private String name="";
public Leaf(String name) {
this.name=name;
}
public void printStuct(int d) {
for(int i=0;i<d;i++)
System.out.print(" “);
System.out.println(’-’+name);
}
}
class Composite{
private CollectionchildComposite=new ArrayList();
private CollectionchildLeaf=new ArrayList();
private String name=”";
public Composite(String name) {
this.name=name;
}
public void addComposite(Composite c) {
this.childComposite.add©;
}
public void addLeaf(Leaf leaf) {
this.childLeaf.add(leaf);
}
public void printStruct(int d) {
for(int i=0;i<d;i++)
System.out.print(" ");
System.out.println(’+’+name);
for(Composite c:childComposite) {
c.printStruct(d+2);
}
for(Leaf leaf:childLeaf) {
leaf.printStuct(d+2);
}
}
}
public class Main{
public static void main(String[] args){
//定义组合对象
Composite root=new Composite(“服装”);
Composite c1=new Composite(“男装”);
Composite c2=new Composite(“女装”);
//定义所有叶子结点
Leaf leaf1=new Leaf(“衬衣”);
Leaf leaf2=new Leaf(“夹克”);
Leaf leaf3=new Leaf(“裙子”);
Leaf leaf4=new Leaf(“套装”);
//按照树的结构来组合组合对象和叶子对象
root.addComposite(c1);
root.addComposite(c2);
c1.addLeaf(leaf1);
c1.addLeaf(leaf2);
c2.addLeaf(leaf3);
c2.addLeaf(leaf4);
root.printStruct(0);
}
}

二.改进
import java.util.ArrayList;

abstract class Component{
protected String name;
public Component(String name) {
this.name=name;
}
public abstract void Add(Component component);
public abstract void Remove(Component component);
public abstract void printStruct(int component);
}

class Leaf extends Component{//叶子结点没有子节点
public Leaf(String name) {
super(name);
}
public void Add(Component component) {
System.out.println(“不能添加分支”);
}
public void Remove(Component component) {
System.out.println(“不能删除分支”);
}
public void printStruct(int d) {
for(int i=0;i<d;i++)
System.out.print(" “);
System.out.println(’-’+name);
}
}
class Composite extends Component{
private ArrayListcomponents=new ArrayList();
public Composite(String name) {
super(name);
}
public void Add(Component component) {
components.add(component);
}
public void Remove(Component component) {
components.remove(component);
}
@Override
public void printStruct(int d) {
// TODO Auto-generated method stub
for(int i=0;i<d;i++)
System.out.print(” ");
System.out.println(’+’+name);
for(Component component:components) {
component.printStruct(d+2);
}
}
}
public class Main{
public static void main(String[] args){
//定义组合对象
Composite root=new Composite(“服装”);
Composite c1=new Composite(“男装”);
Composite c2=new Composite(“女装”);
//定义所有叶子结点
Leaf leaf1=new Leaf(“衬衣”);
Leaf leaf2=new Leaf(“夹克”);
Leaf leaf3=new Leaf(“裙子”);
Leaf leaf4=new Leaf(“套装”);
//按照树的结构来组合组合对象和叶子对象
root.Add(c1);
root.Add(c2);
c1.Add(leaf1);
c1.Add(leaf2);
c2.Add(leaf3);
c2.Add(leaf4);
root.printStruct(0);
}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值