(8)GoF设计模式之组合模式及其实例

定义:

        组合多个对象形成树形结构以表 示“部分-整体”的结构层次。组合模式对单个对象(即叶子对象) 和组合对象(即容器对象)的使用具有一致性。

优点:

        (1)可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次, 让客户端忽略了层次的差异,方便对整个层次结构进行控制

        (2)客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码

        (3)增加新的容器构件和叶子构件都很方便,符合开闭原则

       (4) 为树形结构的面向对象实现提供了一种灵活的解决方案

缺点:

        (1)设计更加抽象,对象的业务规则如果很复杂,实现组合模式具有较大难度。而且不是所有的方法都与叶子对象子类都有关联。

        (2)在增加新构件时很难对容器中的构件类型进行限制

适用范围:

       (1) 在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们

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

        (3)在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型

实例:

实例uml:

 

实例目录:

实例代码:

AbstractFile.java

package composite;

public abstract class AbstractFile {
    public abstract void display();


}

Folder.java

package composite;

import java.util.ArrayList;

public class Folder extends AbstractFile{
    ArrayList list=new ArrayList();
    public void display(){
        for (Object object:list){
            ((AbstractFile)object).display();
        }

    }
    public void remove(AbstractFile abstractFile){
        list.remove(abstractFile);

    }
    public void add(AbstractFile abstractFile){
        list.add(abstractFile);

    }

}

ImageFile.java

package composite;

public class ImageFile extends AbstractFile {
    public void display(){
        System.out.println("查看图片");
    }
}

ViedoFile.java

package composite;

public class ViedoFile extends AbstractFile{
    public void display(){
        System.out.println("查看视频");
    }
}

TextFile.java

package composite;

public class TextFile extends AbstractFile{
    public void display(){
        System.out.println("查看文本");
    }
}

Client.java

package composite;

public class Client {
    public static void main(String[] args) {
        AbstractFile file1,file2,file3,file4,file5;

        file1=new ImageFile();
        file2=new TextFile();
        file3=new ViedoFile();
        Folder folder1=new Folder();
        Folder folder2=new Folder();
        folder1.add(file1);
        folder1.add(file2);
        folder2.add(folder1);
        folder2.add(file3);
        folder2.display();
        System.out.println("软件1928 2019006175");
    }
}

运行结果截图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪 华 杉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值