设计模式——组合模式(本质:统一叶子对象和组合对象)

一、定义:

        将对象组合成树形结构以表示“部分——整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

二、组成角色:

      1、抽象构件角色Component:给参与组合的对象规定一个接口。

      2、树叶构件角色Leaf:没有子对象的对象

      3、 树枝构件角色Composite:有子对象的对象

三、使用场景:

1、需求中体现部分与整体层次的结构;

2、希望用户忽略组合对象和单个对象的不同,统一的使用组合结构中的所有对象。

四、具体分类:(不太理解)

1、透明方式:在Component中声明所有管理子类的方法。

2、安全方式:,,,,,

优缺点:,,,,,,,,

五、组合模式优缺点:

主要优点:统一了组合对象和叶子对象

六、通用代码&&PPT服装管理例子:

//抽象构件角色:定义接口

public abstract class Component {
	protected String name;
	public Component(String name) {
		this.name=name;
	}
	public abstract void add(Component c);
	public abstract void remove(Component c);
	public abstract void display(int depth);	
	
}

//树枝构件角色

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

public class Composite extends Component {
	private List<Component> list=new ArrayList<Component>();
	public Composite(String name) {
		super(name);
		
	}
	@Override
	public void add(Component c) {
			list.add(c);
	}
	@Override
	public void remove(Component c) {
		list.remove(c);

	}
	@Override
	public void display(int depth) {
		for(int i=1;i<=depth;++i)System.out.print("-");
		System.out.println(name);
		for(Component c:list)c.display(depth+4);
	}

}

//树叶构件角色

public class Leaf extends Component{

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

	}
	@Override
	public void add(Component c) {
		System.out.println("不能添加");
		
	}
	@Override
	public void remove(Component c) {
		System.out.println("不能删除");
		
	}
	@Override
	public void display(int depth) {
		for(int i=1;i<=depth;++i)System.out.print("-");
		System.out.println(name);
	}
}

//客户端
package 组合模式;

public class Client {

	public static void main(String[] args) {
		Component c=new Composite("服装");
		Component c1=new Composite("男装");
		Component c2=new Composite("女装");
		Component l1=new Leaf("体恤");
		Component l2=new Leaf("裙子");
		Component l3=new Leaf("校服");
				
		c.add(c1);
		c.add(c2);
		c.add(l3);
		
		c1.add(l1);
		c1.add(l3);
		c1.add(l2);
		
		c2.add(l1);
		c2.add(l2);
		c2.add(l3);
		
			
		c.display(1);
		
		
		c1.remove(l2);
		c.display(1);

	}

}

 

 

 运行结果:

 

       

 

实例(图形应用程序)

 

UML图:

 

 

//抽象构件角色
public abstract class Graphic {
	public abstract void draw();
	public abstract void add(Graphic g);
	public abstract void remove(Graphic g);
	public abstract Graphic getChild(int index);

}
//叶子构件角色

public class Line extends Graphic {

	@Override
	public void draw() {
		System.out.println("画出一条线");

	}

	@Override
	public void add(Graphic g) {
		System.out.println("不能再添加组件");

	}

	@Override
	public void remove(Graphic g) {
		System.out.println("不能移除任何组件");

	}

	@Override
	public Graphic getChild(int index) {
		return null;

	}

}
//叶子构件角色
public class Rectangle extends Graphic {

	@Override
	public void draw() {
		System.out.println("画矩形");

	}

	@Override
	public void add(Graphic g) {
		System.out.println("no 矩形!");

	}

	@Override
	public void remove(Graphic g) {
		System.out.println("no remove!");

	}

	@Override
	public Graphic getChild(int index) {
		return null;

	}
}

//叶子构件角色
public class Text extends Graphic {

	@Override
	public void draw() {
		System.out.println("画一个文本框");
	}

	@Override
	public void add(Graphic g) {
		System.out.println("no add");
	}

	@Override
	public void remove(Graphic g) {
		System.out.println("no remove");

	}

	@Override
	public Graphic getChild(int index) {
		return null;

	}

}

//树枝构件角色
import java.util.*;
public class Picture extends Graphic {
	private List<Graphic> list=new ArrayList<Graphic>();
	@Override
	public void draw() {
		System.out.println("做一张图片!");
		for(Graphic g:list)g.draw();
	}

	@Override
	public void add(Graphic g) {
		list.add(g);
	}

	@Override
	public void remove(Graphic g) {
		list.remove(g);

	}

	@Override
	public Graphic getChild(int index) {
		if(index-1>=0&&index-1<=list.size())return list.get(index+1);
		else return null;

	}

}
package 图形应用程序;
//客户端
public class Cilent {
	public static void main(String[] args) {
		Graphic p=new Picture();
		System.out.println("第1张:");
		Graphic a1=new Line();
		Graphic a2=new Rectangle();
		Graphic a3=new Text();
		p.add(a1);
		p.add(a2);
		p.add(a3);
		p.draw();
		
		Graphic p2=new Picture();
		p2.add(a1);
		p2.add(a2);
		System.out.println("第2张:");
		p.add(p2);
		p.draw();
		
		System.out.println();
		System.out.println("子部件");
		Graphic gg=p.getChild(2);
		gg.draw();

	}

}

 

 

The end;

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值