(八)组合模式-代码实现

意图:将对象组合成树形结构以表示“部分 -整体”的层次结构。 C o m p o s i t e使得用户对单个对象和组合对象的使用具有一致性。

适用性:1,你想表示对象的部分 -整体层次结构。 2,你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

应用场景:树形结构,从树顶控制整个树的操作.

//政府接口

package note.com.composite;

/**
 * 政府接口
 * @author lxz
 *
 */
public interface Government{

    public void build(String str1);

    public boolean add(Government gov);

    public boolean delete(Government gov);
}

//定义了默认方法的抽象类

package note.com.composite;

/**
 * 构造默认新增,删除方法
 * @author lxz
 *
 */
public abstract class AbstractGovernment implements Government{

    public boolean add(Government gov) {
        return false;
    }

    public boolean delete(Government gov) {
        return false;
    }
}

//树顶,根节点

package note.com.composite;

import java.util.ArrayList;
import java.util.List;

/**
 * 中国政府
 * @author lxz
 *
 */
public class ChinaGov extends AbstractGovernment{

    private List<Government> govList = new ArrayList<Government>();
    public void build(String str1) {
        System.out.println("中国:"+str1);
        doIter(str1);
    }

    private void doIter(String str1){
        for(Government gov:govList){
            gov.build(str1);
        }
    }

    @Override
    public boolean add(Government gov) {
        govList.add(gov);
        return true;
    }

    @Override
    public boolean delete(Government gov) {
        govList.remove(gov);
        return true;
    }

}

//无子节点的节点

package note.com.composite;

/**
 * 北京市政府
 * @author lxz
 *
 */
public class BeiJingGov extends AbstractGovernment{

    public void build(String str1) {
        System.out.println("北京市:"+str1);
    }

}
package note.com.composite;

/**
 * 郑州市政府
 * @author lxz
 *
 */
public class ZhengZhouGov extends AbstractGovernment{

    public void build(String str1) {
        System.out.println("郑州市:"+str1);
    }

}

//有子节点的节点

package note.com.composite;

import java.util.ArrayList;
import java.util.List;

/**
 * 河南省政府
 * @author lxz
 *
 */
public class HeNanGov extends AbstractGovernment{

    private List<Government> govList = new ArrayList<Government>();
    public void build(String str1) {
        System.out.println("河南省:"+str1);
        doIter(str1);
    }

    private void doIter(String str1){
        for(Government gov:govList){
            gov.build(str1);
        }
    }

    @Override
    public boolean add(Government gov) {
        govList.add(gov);
        return true;
    }

    @Override
    public boolean delete(Government gov) {
        govList.remove(gov);
        return true;
    }

}

//测试类

package note.com.composite;

public class CompositeTest {
    public static void main(String[] args) {
        Government gov = new ChinaGov();
        Government beijing = new BeiJingGov();
        Government henan = new HeNanGov();
        gov.add(beijing);
        gov.add(henan);
        Government zhengzhou = new ZhengZhouGov();
        henan.add(zhengzhou);

        //中国下发命令
        gov.build("大扫除");
        //河南下发命令
        henan.build("涨工资");

    }
}
时间: 2024-08-01 10:27:48

(八)组合模式-代码实现的相关文章

23种设计模式之组合模式代码实例

组合模式又叫部分整体模式,在处理类似树形结构的问题时常用. public class TreeNode { private String name; private TreeNode parent; private Vector<TreeNode> children = new Vector<TreeNode>(); public TreeNode(String name){ this.name = name; } public String getName() { return

设计模式@第12章:组合模式

第12章:组合模式 一.看一个学校院系展示需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院, 一个学院有多个系.如图: ----------清华大学-------------- ----------计算机学院------------ 计算机科学与技术 软件工程 网络工程 ---------信息工程学院----------- 通信工程 信息工程 二.传统方案解决学校院系展示(类图) 传统方案解决学校院系展示存在的问题分析 将学院看做是学校的子类

组合模式(Composite)

一.组合模式介绍 组合模式:将对象组合成树形结构以表示:部分--整体 的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. java中的组合是指:在A类里定义一个B类的引用,A拥有了B,叫组合.只是单纯的组合而已,而不是一种设计模式. 组合和组合模式不是一回事! 基本上见到的树形结构都使用到了组合模式. 组合模式结构图: 组合模式中有几个核心的部分: Leaf(叶子):表示该节点下面没有其他子节点了,就称为叶子 Compostie(容器构件):容器构件,该节点下还有其他子节点,理解

设计模式(结构型)之组合模式(Composite Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之桥接模式(Bridge Pattern)> http://blog.csdn.net/yanbober/article/details/45366781 概述 组合模式又叫做部分-整体模式,使我们在树型结构的问题中模糊简单元素和复杂元素的概念,客户程序可以像

大话设计模式_组合模式(Java代码)

组合模式:将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 简单描述:1个Composite类,里面持有一个容器成员,容器可以存入自身 大话设计模式中的截图: 代码例子: AbstractComponent类: 1 package com.longsheng.composite; 2 3 public abstract class AbstractComponent { 4 5 public abstract void addC

【JS 设计模式 】用组合模式来实现树形导航--代码结构思路分析(一)

树导航效果图: 组合模式的描述: 将对象组合成树形结构以表示"部分-整体"的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 我们把部分用Leaf表示, 把整体用Composite表示.组合模式是有一定规律的,在实现树导航的情况下,Composite需要包含一个以上Leaf,也可以包含一个以上Leaf和一个以Composite,为什么说要包含一个以上的,如果Composite不包含任何子child的话那么它就是Leaf,Leaf表示是最后一层结节. 树形导航代码片段:

【JS 设计模式 】用组合模式来实现树形导航--JS代码结构思路分析(二)

[JS 设计模式 ]用组合模式来实现树形导航--代码结构思路分析(一) 根据上一节中的HTML代码结构我们通过JS来渲染HTML代码,我们先提供一下JS的代码片段,这代码代码不是一个完整的代码是经过简化的.通过JS代码来分析如何组装HTML的 Composite类型的代码: function TreeComposite(id, name, total, level, last) { var root = document.createDocumentFragment(); var panel =

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

使用组合模式的场景; -- 把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象. 核心: -- 抽象构件(Component)角色:定义了叶子和容器构件的共同点 -- 叶子(Leaf)构件橘色:无子节点 -- 容器(Composite)构件角色: 有容器特征,可以包含子节点 工作流程分析: -- 组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组合,,使得用户在使用时可以一致性的对待容器和叶子 -- 当容器对象的指定方法被调用时,将

设计模式(八)组合模式 Composite

组合模式: 允许你将对象组合成树形结构来表现“整体/部分”层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 组合模式适用于创建复杂的对象,这个对象包含某些个别的对象以及这些对象的组合. 从操作的角度而言,客户端对于 个别对象/组合 的操作是一致的. 模拟场景 如图所示,总公司下属有多个部门,而子公司可以视为多个部门的组合. 整个数据结构呈树状,完美契合组合模式的应用场景. UML: 在这个场景中: 个别对象 -> 人事部(HRDepartment)和财务部(FinanceDepart