java设计模式总结九:合成模式

来源:互联网 发布:p2p网络借贷监管细则 编辑:程序博客网 时间:2024/05/28 14:57

合成模式定义

合成模式,也叫树形模式,就是把部分和整体的关系通过树形结构来表示,使得客户端对单个对象和组合对象的使用具有一致性
合成模式也是继承的另一种替代方法


合成模式组成结构

合成模式主要由三个部分组成:抽象类、叶子类和父类
1.抽象类:这是一个抽象角色,它给参加组合的对象定义出公共的接口以及默认的行为,组合对象的名义父类可以通过它来管理所有的子对象,而不需要通过继承
2.叶子类:名义上的子类,通过实现接口,定义出参加组合的原始对象的行为
3.父类:名义上的父类,通过实现接口的方法进行行为组合,通常在该类中定义一个私有的叶子类成员集合(通常为List或者数组等),主要用于实现父类原始对象行为和叶子类原始对象行为合成


合成模式使用场景

在进行电脑的复制操作时,我们复制文件,使用ctrl+c组合键,然后到目的目录下使用ctrl+v组合键就可以将文件复制到指定文件中。在复制文件夹时,同样使用ctrl+c和ctrl+v进行复制,而不需要将文件夹中的文件一个个的进行复制,即,对于用户而言,不管是文件还是文件夹的复制,操作方式都是一样的,这就是合成模式的典型应用


非合成模式实现:文件(夹)复制

首先创建文件夹类:
public class Folder{    private String name;    private List<Folder> list = new ArrayList<Folder>();    public Folder(){    }    public Folder(String name){        this.name = name;    }    public void add(Folder folder){        list.add(folder);    }    public void remove(Folder folder){        list.remove(folder);    }    public String getName(){        return this.name;    }    public void copy(){        System.out.println("进行文件夹的复制:"+this.getName());        for(int i=0; i<list.size(); i++){            Folder folder = list.get(i);            folder.copy();        }    }}
定义文件,扩展文件夹:
public class File1 extends Folder{    private String name;    public File1(String name){        this.name = name;    }    public String getName(){        return this.name;    }    @Override    public void copy(){        System.out.println("正在复制文件:"+this.getName());    }}public class File2 extends Folder{    private String name;    public File2(String name){        this.name = name;    }    public String getName(){        return this.name;    }    @Override    public void copy(){        System.out.println("正在复制文件:"+this.getName());    }}
最后在客户端进行赋值文件和文件夹测试:
public class Client{    public static void main(String[] args){        Folder folder1 = new Folder("文件夹1");        Folder folder2 = new Folder("文件夹2");        File file1 = new File("文件1");        File file2 = new File("文件2");        File file3 = new File("文件3");        folder1.add(file1);        folder2.add(file2);        folder2.add(file3);        folder1.copy();        folder2.copy();     }}
输出结果可以看到文件和文件夹都能成功复制


合成模式实现:文件(夹)的复制

首先定义一个接口:
public interface Component{    p    pubic void copy();}
分别定义文件和文件夹实现该接口并实现copy方法:
class Folder implements Component{    private String name;    private List<Component> lists = new ArrayList<Component>();    public Folder(String name){        this.name = name;    }    public String getName(){        return this.name;    }    public void add(Component com){        lists.add(com);    }    public void remove(Component com){        lists.remove(com);    }    public void copy(){        System.out.println("文件夹复制中:"+this.getName());        for(int i=0; i<lists.size(); i++){            Component com = lists.get(i);            com.copy();        }    }}class File1 implements Component{    private String name;    public File1(String name){        this.name = name;    }    public String getName(){        return this.name;    }    public void copy(){        System.out.println("\t正在复制文件:"+this.getName());    }}class File2 implements Component{    private String name;    public File2(String name){        this.name = name;    }    public String getName(){        return this.name;    }    public void copy(){        System.out.println("\t正在复制文件:"+this.getName());    }}
客户端测试代码:
public class CompositeMain {    public static void main(String[] args){        Folder folder1 = new Folder("文件夹1");        Folder folder2 = new Folder("文件夹2");        Component file1 = new File1("文件1");        Component file2 = new File2("文件2");        folder1.add(file1);        folder2.add(file2);        folder1.copy();        folder2.copy();    }}
我们可以看到,同样实现了文件和文件夹的复制,并且文件和文件夹之间并没有继承关系,从而减少了类之间的耦合


合成模式应用

合成模式在程序设计中有着广泛的应用,比如Dom4j、资源管理器、Java GUI容器层次图等等都是合成模式应用的典范。
原创粉丝点击