组合模式--java

今天看了一下组合模式的设计 了解了一下组合模式到底是用来干什么的
我们直接开始

component (抽象构件:容器):它可以是接口或者抽象类,为叶子构建和子容器构建对象声明接口,在该角色中可以包含所有子类共有的行为的实现和声明。在抽象构建中定义了访问及管理它的子构件的方法,如增加子构件,删除子构件,获取子构件等。

compsite(子容器构建):它在组合模式中表示容器节点对象,容器结点是子节点,可以是子容器,也可以是叶子构建,它提供一个集合来存储子节点。

leaf(叶子构建):叶子构建没有子构件。它实现了抽象构建中的定义的行为。对于那些访问子容器,删除子容器,增加子容器的就报错。

放到一个文件夹的案例来说: component 就是一个抽象类 它定义了我们需要的一些必要的方法
compsite就是一个文件夹
leaf就是各种类型的文件它下面不会有子节点了

但是我们想一想组合模式到底帮我们干了什么事情喃 如果我们用需要用到树形结构来做一些处理的时候
那么我们做任何处理的时候都需要递归调用一些东西 而且文件和文件夹由于两种功能的不同他们可能会做不同的处理 并且可能会很麻烦 组合模式帮我们轻松的解决了这个问题 大家想一想 如果我们想对文件夹中的某一个文件进行处理的时候 我们需要写递归函数来调用整个树 但是通过组合模式 我们只需要在最高文件夹调用一下它的Operation方法就行了

下面是一个文件树通过组合模式来实现的代码

public abstract class Component {
	//文件名
	private String name;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	//删除文件
	public abstract void removeFile(Component omponent);
	//添加子文件或者叶子节点
	public abstract void addFile(Component omponent);
	//获取子文件夹或者叶子节点
	public abstract Component getFile(String filename);
	//业务的处理
	public abstract void operation();
}
import java.util.ArrayList;
import java.util.List;

public class Composite extends Component{
	//该文件夹下的文件
	private List<Component> components=new ArrayList();
	
	public Composite(String name) {
		this.name = name;
	}

	//文件名  能够唯一标志该文件的
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public void removeFile(Component omponent) {
		boolean flag=components.remove(omponent);
		if(flag){
			System.out.println("删除成功");
		}else{
			System.out.println("没有该文件");
		}
	}

	@Override
	public void addFile(Component component) {
		components.add(component);
		System.out.println("添加文件"+component.getName()+"成功");
	}

	@Override
	public Component getFile(String filename) {
		for(Component component:components){
			if(component.getName().equals(filename)){
				System.out.println("获取文件"+component.getName()+"成功");
				return component;
			}
		}
		return null;
	}

	@Override
	public void operation() {
		System.out.println("对文件夹"+name+"进行杀毒操作");
		for(Component component:components){
			component.operation();//子文件进行操作
		}
	}

}
public class Leaf extends Component{
	private String name; 

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Leaf(String name) {
		super();
		this.name = name;
	}
	@Override
	public void removeFile(Component omponent) {
		// TODO Auto-generated method stub
		System.out.println("无法对该文件进行操作");
	}

	@Override
	public void addFile(Component omponent) {
		// TODO Auto-generated method stub
		System.out.println("无法对该文件进行操作");
		
	}

	@Override
	public Component getFile(String filename) {
		// TODO Auto-generated method stub
		System.out.println("无法对该文件进行操作");
		return null;
	}

	@Override
	public void operation() {
		// TODO Auto-generated method stub
		System.out.println("对文件"+name+"进行杀毒操作");
	}

}
public class Main {
	public static void main(String[] args){
		Composite composite1=new Composite("java");
		Composite composite2=new Composite("设计模式");
		
		composite1.addFile(composite2);//将jdk添加到java文件夹下
		composite1.addFile(new Leaf("java基础"));//在java文件夹下添加java基础文件
		composite1.getFile("设计模式").addFile(new Leaf("组合模式"));//在java文件夹下的jdk文件夹下面添加一个组合模式的问价
		composite1.operation();
	}
}

结果
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值