我的漫漫程序之旅

专注于JavaWeb开发
随笔 - 39, 文章 - 310, 评论 - 411, 引用 - 0
数据加载中……

设计模式之Composite(组合)

Composite定义:
将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.

Composite比较容易理解,想到Composite就应该想到树形结构图。组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。

所以Composite模式使用到Iterator模式,和Chain of Responsibility模式类似。

Composite好处:
1.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。
2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。

如何使用Composite?
首先定义一个接口或抽象类,这是设计模式通用方式了,其他设计模式对接口内部定义限制不多,Composite却有个规定,那就是要在接口内部定义一个用于访问和管理Composite组合体的对象们(或称部件Component).


Composite分为三个角色:

1.Component
树形结构的节点抽象
- 为所有的对象定义统一的接口(公共属性,行为等的定义)
- 提供管理子节点对象的接口方法
- [可选]提供管理父节点对象的接口方法

2.Leaf
树形结构的叶节点。Component的实现子类

3.Composite
树形结构的枝节点。Component的实现子类


Composite分为:

1 透明式

 添加Component对象的操作定义在Component角色中,这样的话不仅Composite需要实现这些方法,Leaf也需要实现这些方法,
 而这些方法对于Leaf来说没有任何意义,不过将系统实现统一起来了,因此对用户来说透明(用户无需区分Composite还是Leaf)
 ,因为这些角色中都具备这些方法。
 
2 安全式

 添加Component对象的操作定义在Composite角色中,这样的话Leaf就无需实现这些方法(因为Leaf本身根本不需要实现这些方法)

 

安全式的实现:

1.抽象角色:

package com.composite;
/***
 * 抽象角色
 * 
@author zdw
 *
 
*/

public interface Component
{
    
void doAction();
}


2.叶子角色:

package com.composite;

/**
 * 叶子角色
 * 
 * 
@author zdw
 * 
 
*/

public class Leaf implements Component
{

    @Override
    
public void doAction()
    
{
        System.out.println(
"Leaf do Action");
    }


}

3.Comosite角色

package com.composite;

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

/**
 * Composite角色
 * 
 * 
@author zdw
 * 
 
*/

public class Composite implements Component
{
    
private List<Component> list = new ArrayList<Component>();

    
public void addComponent(Component component)
    
{
        
if (!list.contains(component))
        
{
            list.add(component);
        }

    }


    
public void removeComonent(Component component)
    
{
        
if (list.contains(component))
        
{
            list.remove(component);
        }

    }


    
public List<Component> getAllComponents()
    
{
        
return list;
    }


    @Override
    
public void doAction()
    
{
        
for (Component com : list)
        
{
            com.doAction();
        }

    }


}


现在写个测试类来测试:

 

 

package com.composite;

public class Client
{
    
public static void main(String[] args)
    
{
        Component leaf1 
= new Leaf();
        Component leaf2 
= new Leaf();

        Composite composite 
= new Composite();
        composite.addComponent(leaf1);
        composite.addComponent(leaf2);
        composite.doAction();
    }

}


对于透明模式只需要把add()或remove等方法,写个抽象角色接口里面就行了.

void add();
void remove();


posted on 2008-05-17 11:06 々上善若水々 阅读(782) 评论(0)  编辑  收藏 所属分类: 设计模式


只有注册用户登录后才能发表评论。


网站导航: