阅读 95

java组合模式

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

20180824010022241.png

component (抽象构件:容器):它可以是接口或者抽象类,为叶子构建和子容器构建对象声明接口,在该角色中可以包含所有子类共有的行为的实现和声明。在抽象构建中定义了访问及管理它的子构件的方法,如增加子构件,删除子构件,获取子构件等。
leaf(叶子构建):叶子构建可以说就是各种类型的文件!叶子构建没有子构件。它实现了抽象构建中的定义的行为。对于那些访问子容器,删除子容器,增加子容器的就报错。
compsite(子容器构建):它在组合模式中表示容器节点对象,容器结点是子节点,可以是子容器,也可以是叶子构建,它提供一个集合来存储子节点。

组合模式的简单实现

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: 抽象文件类,充当抽象构建

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();
}
复制代码

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

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+"--文件杀毒");
    }
}
复制代码

文件类型:

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();
        }
    }
}
复制代码

测试:

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();
    }
}
复制代码

参考

blog.csdn.net/qq_40709468…

文章分类
后端
文章标签