设计模式GOF23——组合模式

组合模式(composite)是结构性模式的一种。结构型模式的核心作用是从程序的结构上实现低耦合,从而可以扩大整体的类结构,用来解决更大的问题。

模式的使用场景

把部分和整体的关系用树形结构来表示,从而使客户端可以使统一的方式处理部分对象和整体对象。

模式的角色

抽象构建角色(Component):定义了叶子和容器的共同特点。
叶子构建角色(Leaf):无子节点。
容器构建角色(Composite):有容器特征,可包含叶子节点。

模式的示例

这个例子是意在模拟杀毒软件软件的架构流程。

//模式角色:抽象构建角色。定义了叶子和结构的共同特点。
public interface AbstractFile {
    //杀毒
    void killVirus();
}
//模式角色:叶子构建角色(没有子节点的抽象实现)
class ImageFile implements AbstractFile{
    //叶子节点的属性和属性的获得方法
    private String name;
    public ImageFile(String name){
        super();
        this.name = name;
    }
    public void killVirus() {
        //抽象方法的实现,这里只输出一句话
        System.out.println("ImageFile"+name+"开始杀毒了!");
    }
}
//模式角色:叶子构建角色(没有子节点的抽象实现)
class TextFile implements AbstractFile{
    //叶子节点的属性和属性的获得方法
    private String name;
    public TextFile(String name){
        super();
        this.name = name;
    }
    public void killVirus() {
        //抽象方法的实现,这里只输出一句话
        System.out.println("TextFile"+name+"开始杀毒了!");
    }
}
//模式角色:容器构建角色:有容器特征,可包含叶子节点。
class File implements AbstractFile{
    //叶子节点的属性和属性的获得方法
    private String name;
    public File(String name){
        super();
        this.name = name;
    }
    private List<AbstractFile> list = new ArrayList<AbstractFile>();
    //叶子节点的添加方法
    public void add(AbstractFile file){
        this.list.add(file);
    }
    //叶子节点的删除方法
    public void remove(AbstractFile file){
        this.list.remove(file);
    }
    //叶子节点的获取方法
    public AbstractFile getChild(int index){
        return list.get(index);
    }
    public void killVirus() {
        //抽象方法的实现,这里先输出一句话
        System.out.println("File"+name+"开始杀毒了!");
        //这里用循环调用所有子文件
        for(AbstractFile file:list){
            //这里其实是一个天然的递归,如果子文件是一个文件夹的话,它也会调用自己的子文件
            file.killVirus();
        }
    }
}
//客户端调用
public class Client {

    public static void main(String[] args) {
        AbstractFile f1,f2;
        f1 = new ImageFile("iamimage");
        f2 = new TextFile("iamtext");
        File f3 = new File("iamfile");
        f3.add(f1);
        f3.add(f2);
        f3.killVirus();
    }

}

它会输出:
Fileiamfile开始杀毒了!
ImageFileiamimage开始杀毒了!
TextFileiamtext开始杀毒了!
就是file中会调用它的叶子节点

组合和组合模式

组合模式和组合是不一样的概念:
组合是对类和属性的关系以及类和类的关系的调整和优化,使得类与类,类与属性的关系更加容易理解和扩展。
组合模式是对类与其中的一些不同实现的方法的调度的同意整理和规划的模式,动态的为一个对象增加新的功能。

模式总结

组合模式把一个方法的各种情况的实现通过树状结构的方法组织管理起来,使得客户端可以用统一的方式处理整体和部分对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值