JAVA的23中设计模式之组合模式

组合模式:

组合模式工作流程分析:

  • 组合模式为处理树形结构提供了完美的方案。描述了如何将容器和叶子如何进行递归组合,使得用户在使用时可以一致性的对待容器和叶子
  • 当容器对象的指定方法被调用时,将遍历整个树形结构,寻找也包括这个方法的成员。并且调用执行,其中使用了递归调用的机制对整个结构进行处理。

组合模式核心:

  • 抽象构件(component)角色:定义了叶子和容器组件的共同点。
  • 叶子(Leaf)构件角色:无子节点
  • 容器(Composite)构件角色:有容器特征,可以包含子节点。

组合模式 :::

package cn.fllday.composite;

/**
 * 抽象组件
 * 这个是一个组合模式的简单小例子。与示例无关
 * @author gssznb
 *
 */
public interface Component {
	void operation();
}


/**
 * 叶子组件
 * @author gssznb
 *
 */
interface Leaf extends Component{
	
}

interface Composite extends Component{
	void add(Component c);
	void remove(Component c);
	Component getChild();
}

举个例子: 模仿杀毒软件如何递归文件夹和文件的

package cn.fllday.composite;


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

/**
 * 抽象构建
 * @author gssznb
 *
 */
public interface AbstractFile {
	void killVirus();  // 杀毒方法
}

class ImgFile implements AbstractFile{

	private String name;

	public ImgFile(String name) {
		super();
		this.name = name;
	}
	@Override
	public void killVirus() {
		System.out.println("图片杀毒成功!" + name);
	}
	
}

class VedioFile implements AbstractFile{

	private String name;

	public VedioFile(String name) {
		super();
		this.name = name;
	}
	@Override
	public void killVirus() {
		System.out.println("视频杀毒成功!" + name);
	}
	
}

class FolderFile implements AbstractFile{

	private String name;
	// 定义容器用来保存子节点
	private List<AbstractFile> list = new ArrayList<>();

	public FolderFile(String name) {
		super();
		this.name = name;
	}
	@Override
	public void killVirus() {
		System.out.println("查杀文件夹");
		for (AbstractFile file : list) {
			file.killVirus();
		}
	}
	
	public void add(AbstractFile file) {
		list.add(file);
	}
	
	public void remove(AbstractFile file) {
		list.remove(file);
	}
	
	
}

通过Client 来进行调用

package cn.fllday.composite;

/**
 * 开发中的应用场景:
 * 	操作系统中的资源管理器。
 * 	GUI的容器层次图
 * 	XML的文件解析
 * 	OA系统中,组织结构的处理
 * 	Junit的单元测试框架。
 * @author gssznb
 *
 */
public class Client {
	public static void main(String[] args) {
		AbstractFile f2,f4,f5,f6;
		FolderFile f1 = new FolderFile("我的收藏"),f3;
		f2 = new VedioFile("苍老师的唯一.avi");
		f3 = new FolderFile("256G种子");
		f4 = new ImgFile("苍天.jpg");
		f5 = new VedioFile("haha.avi");
		f1.add(f2);
		f1.add(f5);
		f1.add(f3);
		f3.add(f4);
		f1.killVirus();
	}
}

 

使用组合模式的场景:
    把部分和整体的关系用属性结构来表示。从而使客户端可以使用统一的方式处理部分对象和整体对象。

提一个记忆比较深刻的应用。 之前写用户的权限控制的时候。如果用户没有该页面的权限就不给予这个页面的入口。这个应用就可以使用组合的方式,当时没有了解到组合模式。就自己写了一个递归来进行排序。 效果还好。感觉跟这个一比简直太蠢哈哈。

树形结构无限极分类数据结构以及递归函数写法 就是这个了。有兴趣可以看看哈哈

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值