JAVA组合模式

JAVA组合模式

通过本文将学习到

Table of Contents

1、组合模式的概念

2、组合模式的UML图

3、组合模式的实现

4、组合模式的优缺点

5、组合模式适用场景

6、总结

7、关于最近一些事。


 

红色代表重点,黑色代表废话!蓝色觉得好看。

1、组合模式的概念

组合模式:组合多个对象形成树形结构以表示有整体-部分关系层次结构,组合模式可以让客户端统一对待单个对象和组合对象

组合模式有点难理解!树形结构就是组合模式的体现。文件中可以包含子文件和子文件夹,但是子文件中不能够再继续包含子文件。简单的说子文件就是最后一级别。上图好吧,上图靠谱。

由于在使用的时候,比如某个文件夹的方法被调用,那么这个会遍历整个树形结构,寻找也包含这个方法的具体实现(文件)。并且调用执行,其中会使用到递归调用的机制对整个机构进行处理。由于,容器和叶子的功能上的区别,在使用这些对象代码中必须去别的对待容器和叶子,这样会让程序非常复杂。

所以,组合模式就出现了!通过一些设计。让容器(文件夹)和叶子(文件)作为相同的对象来处理!

 


2、组合模式的UML图

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

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

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

 


3、组合模式的实现

 最简单的一个实现:

component

public abstract class Component{
    //这个是容器类的抽象类,定义好行为,定义创建移除子容器的方法抽象的。
    public abstract void addComposite(Component c); //添加成员
    public abstract void removeComposite(Component c);//移除成员
    public abstract Component getComposite(int i);//获取子容器
    public abstract void operation();//业务方法

}

leaf

public class Leaf extends Component{
    //首先重写component的方法
    //叶子节点关键点在于业务
    public void Operation(){
        System.out.print("业务方法");
    }
    
    public void addComponent(Component c){
        //提示报错呗 。
        System.out.print("不是子容器");
    }
   public void removeComponent(Component c){
        //提示报错呗 。
        System.out.print("不是子容器");
    }
public Component addComponent(int c){
        //提示报错呗 。
        System.out.print("不是子容器");
        return null;
    }

}

 

composite

public class Composite extends Component{
    //首先来一个存储的集合
    private ArrayList<Component> list = new ArrayList<Component> ;
    public void addComponent(Component c){
            list.add(c);
    }
   public void removeComponent(Component c){
            list.remove(c);
    }
   public Component getComponent(int c){
            Component c1 =list.get(c);
             return c1;
    }
    public void operation(){
        for(Object obj:list){
            ((Component)obj).operation();
        }
    }

    
}

 

以上是一个最简单的实现。现在来一个正式例子。

杀毒软件,该软件能够对某个文件夹杀毒,也可以指定对某些文件杀毒。

AbstractFile: 抽象文件类,充当抽象构建。

package compositePattern;
/**
 * 
* <p>Title: AbstractFiles</p>  
* <p>Description:in this class we are  use to test composite pattern </p>  
* @author HAND_WEILI  
* @date 2018年8月26日
 */
public abstract class AbstractFiles {
  public abstract void add(AbstractFiles af);
  public abstract void remove(AbstractFiles af);
  public abstract AbstractFiles get(int  i);
  public abstract void killVirus();
}

叶子节点:文件类型,就写了一种。

package compositePattern;

public class ImageFile extends AbstractFiles {
	private String name;
	
	public ImageFile(String name) {
		
		this.name=name;
	}

	@Override
	public void add(AbstractFiles af) {
		// TODO Auto-generated method stub
			System.out.println("不支持该方法");
	}

	@Override
	public void remove(AbstractFiles af) {
		// TODO Auto-generated method stub
		System.out.println("不支持该方法");
	}

	@Override
	public AbstractFiles get(int i) {
		// TODO Auto-generated method stub
		System.out.println("不支持该方法");
		return null;
	}

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

}

文件类型:

package compositePattern;

import java.util.ArrayList;

public class Folder extends AbstractFiles {
	//文件夹类,所有的都可以用
	private ArrayList<AbstractFiles> list = new ArrayList<AbstractFiles>();
	private String name;
	public Folder(String name) {
		this.name=name;
	}

	@Override
	public void add(AbstractFiles af) {
		list.add(af);
		System.out.println("添加成狗");

	}

	@Override
	public void remove(AbstractFiles af) {
		// TODO Auto-generated method stub
		if(list.remove(af)) {
			System.out.println("删除成功");
		}else{
			System.out.println("删除失败");
		}
		
	}

	@Override
	public AbstractFiles get(int i) {
		// TODO Auto-generated method stub
		
		return list.get(i);
	}

	@Override
	public void killVirus() {
		// TODO Auto-generated method stub
		System.out.println("对文件夹"+name+"进行杀毒");
		//递归调用
		for(Object o:list) {
		((AbstractFiles)o).killVirus();
		
		}
	}

}

 

测试:

package compositePattern;

public class Client {
	public static void main(String[] args) {
		//创建一个文件类型
		AbstractFiles f1 = new Folder("主文件夹");
		//创建文件
		AbstractFiles file1= new ImageFile("孙悟空。png");
		AbstractFiles file2= new ImageFile("龙珠.jpg");
		AbstractFiles file3= new ImageFile("帅哥威.gif");
		f1.add(file1);
		f1.add(file2);
		f1.add(file3);
		f1.killVirus();
		file1.killVirus();
	}

}


4、组合模式的优缺点

优点:

  1. 可以清楚地定义分层次的复杂类型,表示对象的全部层次或者部分层次  ,它让客户端忽略了层次的差异,方便对整个层次经行控制。
  2. 客户端可以一致的使用一个组合模式或对单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端的代码。
  3. 在组合模式种增加新的容器构件和叶子构件都很方便,无需对现有类库进行任何修改,符合开闭原则。
  4. 为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合可以形成复杂的树形机构,但对树形结构的控制却很简单。

缺点:

  1.       在增加新的构件时就比较难咯。而且难以限定,有时候希望在一个容器种能有某些特定的对象,例如在某个文件夹只能有image或者gif等。这个就比较难以实现。

 


5、组合模式适用场景

        1、在具有整体和部分的层次结构种希望通过一种忽略整体与个体之间差异的,客户端一致对待的情况。

        2、在一个使用面向对象语言开发的系统中需要处理一个树形结构的。

        3、在一个系统中能分离出叶子和容器的,而且他们的类型还固定不变,需要增加一些新的类型


6、总结

     1、 组合模式用于组合多个对象所构成的树形结构层次。2、组合模式包含抽象构建,叶子构建,和容器构建三种角色。

3、组合模式的优点是解决客户端不好统一对待两种类型的类,缺点是面对一些特殊要求时不好办!

  

7、关于最近一些事。

       最近两天滴滴司机奸杀一位幼师的事再次刷屏,我也关注了此事!滴滴处理投诉的效率之低,对于人生安全的不重视,客服的不当回事的态度着实让人恼怒。为了所谓的隐私,客服的死板,都是造成这起惨剧的原因。所谓的安全专家更是不负责任,打个电话问有没有接到,没接到就没下文了?更可气的是,在前一天都有人举报了此司机有侵犯行为。却视若无睹。这一切的一切都是再次造成这种犯罪的原因!但是,想靠别人是不行的。滴滴有着无可推卸的责任,但是更可怕的是一些隐藏在阳光下的黑暗。所以只有靠自己,提前做好应对的办法,碰到了事情就不会慌张,因此在出行方面我以后要给我女朋友配上防狼喷雾!我不想让这种事情发生在我亲人身边,因为如果发生了,就算把凶手活扒了逝去的人也不会再回!

        因此在这些关于安全方面的问题一定不能够马虎,因为哪怕是一个烟蒂,哪怕是别人一时的犯罪冲动,都有可能造成让人一身痛苦的记忆。所以长点心我得威。然后在此希望遭受了这一切惨痛的姑娘们,愿天堂没有伤害!虽然知道说了没什么用,但还是希望你的家人们以后能够的好一点吧。前车之鉴后车之师。可为什么滴滴却还如此不长心了!可为什么客服就不能想到后果的严重性了,为什么就不能那么的死板了?也许,只要其中一个环节做好了就不会发生这种惨事了吧,或者说至少还有一丝余地吧。如花似玉的年纪,正在绽放的人生,就因为一个人的恶念说没就没了!也是,世上本就是弱肉强食。大部分是善良的人但是还是要做好准备迎接哪些恶人!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值