设计模式学习(八) 组合模式

使用组合模式的场景;

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

核心:

  -- 抽象构件(Component)角色:定义了叶子和容器构件的共同点

  -- 叶子(Leaf)构件橘色:无子节点

  -- 容器(Composite)构件角色: 有容器特征,可以包含子节点

工作流程分析:

  -- 组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组合,,使得用户在使用时可以一致性的对待容器和叶子

  -- 当容器对象的指定方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员,并调用执行。其中使用了递归调用的机制对整个结构进行处理。

使用组合模式,模拟杀毒软件架构设计:

代码:

public interface AbstractFile {

    void killVirus(); //杀毒
}

抽象构件

class ImageFile implements AbstractFile{

    private String name;
    public ImageFile(String name) {
        super();
        this.name = name;
    }
    @Override
    public void killVirus() {
        System.out.println("---图像文件: " + name + "进行查杀");

    }

}

class TextFile implements AbstractFile{

    private String name;
    public TextFile(String name) {
        super();
        this.name = name;
    }
    @Override
    public void killVirus() {
        System.out.println("---文本文件: " + name + "进行查杀");

    }

}

class VideoFile implements AbstractFile{

    private String name;
    public VideoFile(String name) {
        super();
        this.name = name;
    }
    @Override
    public void killVirus() {
        System.out.println("---视频文件: " + name + "进行查杀");

    }

}

叶子

package com.lp.component;

import java.util.ArrayList;
import java.util.List;
class Folder implements AbstractFile{

    private String name;
    public Folder(String name) {
        super();
        this.name = name;
    }

    private List<AbstractFile> list = new ArrayList<AbstractFile>();

    @Override
    public void killVirus() {
        System.out.println("---文件夹: " + name + "进行查杀");

        for(AbstractFile file : list){
            file.killVirus();

        }
    }

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

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

    public AbstractFile getChild(int index){
        return list.get(index);
    }

}

容器

开发中的应用场景:

时间: 2024-08-29 15:19:43

设计模式学习(八) 组合模式的相关文章

设计模式学习心得&lt;组合模式 Composite&gt;

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式,它创建了对象组的树形结构. 这种模式创建了一个包含自己对象组的类.该类提供了修改相同对象组的方式. 概述 意图 将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 主要解决 它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客

设计模式学习笔记——组合模式

组合模式 组合模式,将对象组合合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 代码实现 接口声明Component /** * 接口声明 * @author xukai 2016年3月26日 下午4:58:37 * */ public abstract class Component { protected String name; public Component(String name) { this.name = name; }

设计模式学习笔记--组合模式

1 using System; 2 3 namespace Composite 4 { 5 /// <summary> 6 /// 作者:bzyzhang 7 /// 时间:2016/5/30 7:11:10 8 /// 博客地址:http://www.cnblogs.com/bzyzhang/ 9 /// Component说明:本代码版权归bzyzhang所有,使用时必须带上bzyzhang博客地址 10 /// </summary> 11 public abstract cl

设计模式学习02—工厂模式

1.动机与定义 我们在程序中使用一个对象时,需要new一下,如果需要设置其他值就再初始化一下.比如我要使用一个按钮,手动new一个矩形按钮,然后初始化一些值,如显示文字,背景色等. // 矩形按钮 IButton btn = new RecButton(); // 初始化其他值 btn.setText("提交"); btn.setBackgroundColor("#00aaff"); // 其他初始化省略 // 圆形按钮 IButton btn2 = new Rou

设计模式学习05—原型模式

一.动机与定义 之前学习原型模式一直以为原型模式目的是为了方便的创建相同或相似对象,用复制对象的方式替换new的方式,还研究了深克隆和浅克隆.最近仔细看了GOF的设计模式,发现原型模式的本意并不仅仅是复制对象这么简单. 复制对象确实是一方面,当我们需要大量相似,甚至相同对象的时候,除了一个个的new之外,还可以根据一个原型,直接复制出更多的对象.但是如果把原型模式认为只是复制对象这么简单就错了. 创建型模式主要讲如何创建对象,通常包含何时创建,谁来创建,怎么创建等.GOF书里面写的意图是,用原型

设计模式学习04—建造者模式

一.动机与定义 创建对象时,我们知道可以使用工厂方式来创建,使调用者和具体实现解耦,但是有一种情况,当要创建的多个对象之间重复性较大,只有创建步骤.组装顺序或者内部构件不同时,工厂模式就需要进一步的演化了,如我们去KFC,有很多种套餐,比如套餐1(薯条+可乐+汉堡),套餐2(鸡肉卷+薯条+可乐),这个套餐就是我们要获取的复杂对象,那么程序如何创建出这种对象呢. 我们看到套餐的内容很多是一样的,那么我们是不是可以考虑将创建单个食品(如鸡肉卷.可乐等)方法提取出来,使用单独一个类协调这些食品的组合比

设计模式学习之代理模式学习(一)

关于设计模式想必学习过Java语言的人都知道吧,当时对其进行深入学习的的人应该不是很多.在我看来设计方面的知识相比于框架应用配置等知识要有意思的多,并且设计模式的对一个程序员的编程思想提升有着很大的帮助.但是设计模式有二十三种,想要全部掌握还是要花点时间的,但如果是只学习常用的几种设计模式还是相对容易的.下面是我学习代理模式的一些心得. 问题引出      什么是代理模式,为什么要用代理模式. 现在有一个场景模拟:有一个tank类,他实现了Moveable接口,Moveable接口中有一个mov

设计模式C++实现——组合模式

模式定义: 组合模式允许你将对象组合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 这个模式能够创建一个树形结构,在同一个结构中处理嵌套菜单和菜单项组.通过菜单和项放在相同结构中,我们创建了一个"整体/部分"层次结构,即由菜单和菜单项组成的对象树.使用组合结构,我们能把相同的操作应用在组合和个别对象上.换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别. 模式结构: Component: 为组合中的对象声明

设计模式学习之-状态模式

一.状态模式状态模式,当一个对象的内在状态发生改变时允许改变其行为行为,这个对象像是改变了其子类.状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同的状态的一系列类当中,可以把复杂的判断逻辑简化.当然,如果这个状态判断比较简单,那就没有必要用“状态模式”了.这段话有点难以理解,简而言之就是,在一类中根据当前状态去实例化下一状态子类.下面是状态模式结构图. State类,是一个抽象状态类,定义一个接口以封装与Context的特定状态相关的行为.

设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕该功能.如查找.排序等,一种经常使用的方法是硬编码(Hard Coding)在一个类中,如须要提供多种查找算法,能够将这些算法写到一个类中,在该类中提供多个方法,每个方法相应一个详细的查找算法:当然也能够将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件推断语句来进行选择.