定义:

将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

结构:(书中图,侵删)

一个Component接口:定义统一的方法
若干树枝(Composite)类(继承Component):可包含若干个叶子(Leaf)节点
若干树叶(Leaf)类:叶子节点
 
书中说到这个模式有两种方式:
透明方式:在Component接口中定义添加和移除子节点的方法,但是叶子节点不需要这两个方法。这样写可以保持客户端调用的一致性。
安全方式:不在Component接口中定义添加和移除子节点的方法,直接在叶子节点中定义,这样写省去了叶子节点中的无用代码,但是客户端需要添加判断。

实例:

书中举到一个例子说是,假如你在word修改字体的大小时,你修改一个字和一段文字操作都是相同的。用户不用对此有差别操作,程序也不用差别对待。
然后,就让我想到了游戏中的队伍系统,在某些游戏里是可以跟随的,队长操纵自己,整个队伍都会跟着一起行动,和队长一个人行动没有什么区别。
 
玩家操纵的目标接口(Component):

package designpattern.composite;

public abstract class Target {
private String name;// 名称 public abstract void add(Target target);// 增加节点 public abstract void remove(Target target);// 删除节点 public abstract void move();// 移动 public abstract void attack();// 攻击 public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }
玩家类(Leaf):

package designpattern.composite;

public class Player extends Target {
private String name; public Player(String name) {
super();
this.name = name;
} @Override
public void move() {
System.out.println("[" + name + "]正在移动");
} @Override
public void attack() {
System.out.println("[" + name + "]发动攻击");
} @Override
public void add(Target target) {
} @Override
public void remove(Target target) {
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "Player [name=" + name + "]";
} }
队伍类(Composite):

package designpattern.composite;

import java.util.ArrayList;
import java.util.List; public class Team extends Target {
List<Target> team = new ArrayList<>(); @Override
public void add(Target target) {
team.add(target);
System.out.println(target.getName() + "加入队伍");
} @Override
public void remove(Target target) {
team.remove(target);
System.out.println(target.getName() + "离开队伍");
} @Override
public void move() {
System.out.println(teamMembers() + "组成的队伍正在移动");
} @Override
public void attack() {
System.out.println(teamMembers() + "组成的队伍发动攻击");
} private String teamMembers() {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("[");
for (Target target : team) {
stringBuffer.append(target.getName() + " ");
}
stringBuffer.append("]");
return stringBuffer.toString();
}
}
客户端:

package designpattern.composite;

public class Client {
public static void main(String[] args) {
Player captainAmerica = new Player("美国队长");
captainAmerica.move();
captainAmerica.attack(); System.out.println("----------复联成立----------");
Player ironMan = new Player("钢铁侠");
Player hulk = new Player("绿巨人");
Team team = new Team();
team.add(captainAmerica);
team.add(ironMan);
team.add(hulk); team.move();
team.attack(); System.out.println("----------发生矛盾--------");
team.remove(ironMan); team.move();
team.attack();
}
}
结果输出:

[美国队长]正在移动
[美国队长]发动攻击
----------复联成立----------
美国队长加入队伍
钢铁侠加入队伍
绿巨人加入队伍
[美国队长 钢铁侠 绿巨人 ]组成的队伍正在移动
[美国队长 钢铁侠 绿巨人 ]组成的队伍发动攻击
----------发生矛盾--------
钢铁侠离开队伍
[美国队长 绿巨人 ]组成的队伍正在移动
[美国队长 绿巨人 ]组成的队伍发动攻击

总结:

这个模式用在两个事物存在一定的包含关系,但是他们的行为又是一致的,为了让客户可以方便统一的使用他们。
套用书中的话:组合模式让客户可以一致的使用组合结构和单个对象。

设计模式 | 组合模式(composite)的更多相关文章

  1. 浅谈设计模式--组合模式(Composite Pattern)

    组合模式(Composite Pattern) 组合模式,有时候又叫部分-整体结构(part-whole hierarchy),使得用户对单个对象和对一组对象的使用具有一致性.简单来说,就是可以像使用 ...

  2. 设计模式 - 组合模式(composite pattern) 迭代器(iterator) 具体解释

    组合模式(composite pattern) 迭代器(iterator) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考组合模式(composit ...

  3. 设计模式组合模式(Composite)精华

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助如何创建一个系统独立.这是一个这些对象和陈述的组合. 创建使用继承类的类架构更改实例.的对象类型模型的建 ...

  4. 设计模式 -- 组合模式 (Composite Pattern)

    定义: 对象组合成部分整体结构,单个对象和组合对象具有一致性. 看了下大概结构就是集团总公司和子公司那种层级结构. 角色介绍: Component :抽象根节点:其实相当去总公司,抽象子类共有的方法: ...

  5. 设计模式--组合模式Composite(结构型)

    一.概念 组合模式允许你将对象组合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 二.UML图 1.Component(对象接口),定义 ...

  6. C#设计模式——组合模式(Composite Pattern)

    一.概述 在软件开发中,我们往往会遇上类似树形结构的对象体系.即某一对象既可能在树形结构中作为叶节点存在,也可能作为分支节点存在.比如在文件系统中,文件是作为叶节点存在,而文件夹就是分支节点.在设计这 ...

  7. 设计模式-组合模式(Composite)

    一.概念 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 二.模式动机 组合模式,通过设计一个抽像的组件类,使它既代表叶子对象,又代表组合对 ...

  8. 说说设计模式~组合模式(Composite)

    返回目录 何时能用到它? 组合模式又叫部分-整体模式,在树型结构中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦.对于今天这个 ...

  9. 大话设计模式--组合模式 Composite -- C++实现实例

    1. 组合模式: 将对象组合成树形结构以表示"部分--整体"的层次结构,组合模式使用户对单个对象和组合对象的使用具有一致性. 需求中是体现部分与整体层次的结构时,希望用户可以忽略组 ...

  10. 设计模式(七)组合模式Composite(结构型)

    设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 ...

随机推荐

  1. python gdal库安装

    yum安装了postgis之后,会安装依赖gdal centos7.5的repo中gdal为1.11.4-3版本

  2. Light oj-1004 - Monkey Banana Problem,数字三角形的变形版~

                                                                                                     100 ...

  3. Codeforces Round #321 (Div. 2)-B. Kefa and Company,区间最大值!

    ->链接在此<- B. Kefa and Company time limit per test 2 seconds memory limit per test 256 megabytes ...

  4. poj 1330lca模板题离线算法

    #include<iostream> #include<vector> using namespace std; const int MAX=10001; int pre[MA ...

  5. 洛谷P1186 玛丽卡

    题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城 ...

  6. 【ZJOI2017 Round1练习&&BZOJ5353】D7T2 guess(费用流)

    题意: 思路: ..]of longint; pre:..,..]of longint; inq:..]of boolean; q:..]of longint; n,m,i,j,ans,tot,sou ...

  7. Linux下汇编语言学习笔记52 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  8. Linux下汇编语言学习笔记25 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  9. poj - 3041 Asteroids (二分图最大匹配+匈牙利算法)

    http://poj.org/problem?id=3041 在n*n的网格中有K颗小行星,小行星i的位置是(Ri,Ci),现在有一个强有力的武器能够用一发光速将一整行或一整列的小行星轰为灰烬,想要利 ...

  10. substring详细用法,截取不行就用替换

    SUBSTRING 返回字符.binary.text      或      image      表达式的一部分.有关可与该函数一起使用的有效      Microsoft®      SQL    ...