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

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


合成模式组成结构
合成模式主要由三个部分组成:抽象类、叶子类和父类
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容器层次图等等都是合成模式应用的典范。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值