设计模式-组合模式
来源:互联网 发布:淘宝微任务平台 编辑:程序博客网 时间:2024/04/27 19:44
出处:http://blog.chinaunix.net/uid-23637692-id-3789442.html
定义:
又叫做部分-整体模式,一般用来处理类似树形结构的问题。它模糊处理元素与部分整体,使得客户端能够统一处理简单或者复杂的元素,从而使得客户端程序同元素的结构之间解耦。
作用:
- 统一元素与部分整体,简化处理代码
- 将元素内部结构同处理程序解耦,从而一致的对待元素与部分整体。
实际上,组合模式在应用中其实非常广泛,像文件系统、企业结构等都可以看做是组合模式的典型应用。
图1 Linux文件系统结构
图2 组合模式组成图
Component:定义成接口或者抽象类,是元素与不部分整体的父类。
Leaf:叶子节点,定义了基本元素的特征,继承自Component父类,是整体最基本的组成部分。
Composite:部分整体或者容器,继承或实现自Component父类。内部包含Composite或者Leaf的聚合,用来保存内部的组织结构,并且针对该聚合有相应的操作方法。
组合模式关键定义了一个抽象类或者接口,既可以代表元素又可以代表部分整体,而客户端是针对该接口进行编程。因此,客户端不需要知道是元素还是部分整体,对其统一进行处理。
下面具体看一下代码示例:Component接口:
- public interface Component {
- public void add(Component e);
-
- public void del(Component e);
-
- public Component get(int i);
-
- public void operate();
- }
- public class Leaf implements Component {
- private String name;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @Override
- public void add(Component e) {
- }
- @Override
- public void del(Component e) {
- }
- @Override
- public Component get(int i) {
- return null;
- }
- @Override
- public void operate() {
- System.out.println(name);
- }
- }
部分整体Composite:
- public class Composite implements Component {
- private List<Component> list = new ArrayList();
-
- @Override
- public void add(Component e) {
- list.add(e);
- }
- @Override
- public void del(Component e) {
- list.remove(e);
- }
- @Override
- public Component get(int i) {
- return list.get(i);
- }
- @Override
- public void operate() {
-
- Iterator it = list.iterator();
- while(it.hasNext()){
- Component component = (Component) it.next();
- component.operate();
- }
- }
- }
客户端代码调用:
- public class Customer {
- public static void main(String[] args) {
- Leaf leaf1 = new Leaf();
- leaf1.setName("leaf1");
- Leaf leaf2 = new Leaf();
- leaf2.setName("leaf2");
- Leaf leaf3 = new Leaf();
- leaf3.setName("leaf3");
- Leaf leaf4 = new Leaf();
- leaf4.setName("leaf4");
- Leaf leaf5 = new Leaf();
- leaf5.setName("leaf5");
-
- Composite composite1 = new Composite();
- Composite composite2 = new Composite();
- Composite composite3 = new Composite();
- composite3.add(leaf5);
- composite2.add(composite3);
- composite2.add(leaf4);
- composite2.add(leaf3);
- composite1.add(composite2);
- composite1.add(leaf2);
- composite1.add(leaf1);
-
- composite1.operate();
- }
- }
输出结果:
- leaf5
- leaf4
- leaf3
- leaf2
- leaf1
模式适用环境
1. 在对象与部分整体之间,想要通过统一的方式对其进行处理,模糊处理其差异的时候可以选用组合模式
2. 当客户端忽视结构层次,无差异的看待元素与部分整体,不关心元素和部分整体之间的层次结构,想要实现对统一接口编程的时候
3. 对象的变化是动态,而客户端想要一致的处理对象的时候
综上,在上述3种情况下可以考虑使用组合模式来设计系统程序。
- 设计模式:组合模式
- 设计模式-----组合模式
- 设计模式 组合模式
- 设计模式--组合模式
- 设计模式---组合模式
- 【设计模式】组合模式
- 设计模式 - 组合模式
- 设计模式----组合模式
- 设计模式 - 组合模式
- 设计模式:组合模式
- 设计模式 - 组合模式
- 设计模式-组合模式
- 设计模式 - 组合模式
- 【设计模式】组合模式
- 设计模式--组合模式
- 设计模式-组合模式
- 设计模式:组合模式
- 设计模式-----组合模式
- 云计算
- Coherence(5)-网格查询
- C程序freopen()实现快速从文件输入和输出(重定向)到文件(ACM练习好帮手)
- java容器类
- DNS原理总结及其解析过程详解
- 设计模式-组合模式
- URLDecoder: Incomplete trailing escape (%) pattern
- dwr框架异步调用简单小例
- 第九周项目5-一元一次方程类
- 多个mapreduce过程的组合模式
- window命令之 --Regsvr32(注册、删除动态链接库)
- 使用GNU Autotools自動編譯項目
- anr产生的原理和如何避免(待写)
- SQL SERVER命令总结