java设计模式7:Composite

本文介绍了组合模式的两种形式:安全式和透明式。安全式模式通过让树枝构件定义管理子对象的方法来防止对树叶构件的误操作;透明式模式则要求所有构件都遵循相同的接口。通过图形绘制的例子展示了两种模式的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安全式的组合模式

涉及到三个角色:
    1、抽象构件(Component):这是一个抽象角色,它给参加组合的对象定义出公共的接口及其默认行为,可以用来管理所有的子对象。组合对象通常把它所包含的子对象当做类型为Component的对象。在安全式的合成模式里,构件角色并不定义出管理子对象的方法,这一定义由树枝构件对象给出。
    2、树叶构件(Leaf):树叶对象是没有下级子对象的对象,定义出参加组合的原始对象的行为。
   3、树枝构件(Composite):代表参加组合的有下级子对象的对象。树枝构件类给出所有的管理子对象的方法,如add(),remove(),以及components()的声明。

image

package com.javapatterns.composite;

/**
* @author  luhx
*/
public interface Component {

    Composite getComposite();

    void sampleOperation();
}

 

 

package com.javapatterns.composite;

import java.util.Vector;
import java.util.Enumeration;

public class Composite implements Component
{
    public Composite getComposite()
    {
        return this;
    }

    public void sampleOperation()
    {
        java.util.Enumeration enumeration = components();
        while (enumeration.hasMoreElements())
        {
            ((Component)enumeration.nextElement()).sampleOperation();
        }
    }

    public void add(Component component)
    {
        componentVector.addElement(component);
    }

    public void remove(Component component)
    {
        componentVector.removeElement(component);
    }

    public Enumeration components()
    {
        return componentVector.elements();
    }

    /**
     * @associates   <{Component}>
     * @link   aggregation
     * @supplierCardinality   0..
     * @uml.property  name="componentVector"
     * @uml.associationEnd  multiplicity="(0 -1)" inverse="composite:com.javapatterns.composite.Component"
     */
    private Vector componentVector = new java.util.Vector();
}

 

 

package com.javapatterns.composite;

public class Leaf implements Component {
    public Composite getComposite(){
        // Write your code here
        return null;
    }

    public void sampleOperation(){
        // Write your code here
    }
}

可以看出,树枝构件类给出了add(),remove()以及components()等方法的声明和实现,而树叶构件类则没有给出这些方法的声明或实现。由于这个特点,客户端应用程序不可能错误地调用树叶构件的聚集方法,因为树叶构件没有这些方法,调用会导致编译出错。

 

 

 

透明式的组合模式的结构

与安全模式的组合模式不同的是,透明式的组合模式要求所有的具体构件类,不论树枝构件还是树叶构件,均符合一个固定的接口。透明式的组合模式的示意性类图如下所示:
image

涉及到三个角色:

1、抽象构件(Component):这是一个抽象角色,它给参加组合的对象规定一个接口,规范共有的接口及默认行为。这个接口可以用来管理所有的子对象,要提供一个接口以规范取得和管理下层组件的接口中,包括add(),remove()以及getChild()之类的方法。
2、树叶构件(Leaf):代表参加组合的树叶对象,定义出参加组合的原始对象的行为。树叶类会给出add(),remove(),以及getChild()之类的用来管理子类对象的方法的平庸实现。
3、树枝构件(Composite):代表参加组合的有子对象的对象,定义出这样的对象的行为

 

package com.javapatterns.composite.transparent;

import java.util.Enumeration;
/**
* @author  luhx
*/
public interface Component
{
    void sampleOperation();

    /**
     * @uml.property  name="composite"
     * @uml.associationEnd  inverse="componentVector:com.javapatterns.composite.transparent.Composite"
     */
    Composite getComposite();

    void add(Component component);

    void remove(Component component);

    Enumeration components();
}

 

package com.javapatterns.composite.transparent;

import java.util.Vector;
import java.util.Enumeration;

public class Composite implements Component
{
    public Composite getComposite()
    {
        return this;
    }

    public void sampleOperation()
    {
        java.util.Enumeration enumeration = components();
        while (enumeration.hasMoreElements())
        {
            ((Component)enumeration.nextElement()).sampleOperation();
        }
    }

    public void add(Component component)
    {
        componentVector.addElement(component);
    }

    public void remove(Component component)
    {
        componentVector.removeElement(component);
    }

    public Enumeration components()
    {
        return componentVector.elements();
    }

    /**
     * @associates   <{Component}>
     * @link   aggregation
     * @supplierCardinality   0..
     * @uml.property  name="componentVector"
     * @uml.associationEnd  multiplicity="(0 -1)" inverse="composite:com.javapatterns.composite.transparent.Component"
     */
    private Vector componentVector = new java.util.Vector();
}

 

 

package com.javapatterns.composite.transparent;

import java.util.Enumeration;
import java.util.Vector;

public class Leaf implements Component
{
    public void sampleOperation()
    {
        // Write your code here
    }

    public void add(Component component)
    {
        componentVector.addElement(component);
    }

    public void remove(Component component)
    {
        componentVector.removeElement(component);
    }

    public Composite getComposite()
    {
        // Write your code here
        return null;
    }

    public Enumeration components()
    {
        // Write your code here
        return null;
    }

    /**
     * @associates   <{Component}>
     * @link   aggregation
     * @supplierCardinality   0..
     * @uml.property  name="componentVector"
     * @uml.associationEnd  multiplicity="(0 -1)" elementType="com.javapatterns.composite.transparent.Component"
     */
    private Vector componentVector = new java.util.Vector();
}

 

 

一个例子(安全式组合模式):

image

package com.javapatterns.composite.drawingsafe;

abstract public class Graphics
{
    public abstract void draw();
}

 

package com.javapatterns.composite.drawingsafe;

public class Circle extends Graphics
{
    public void draw()
    {
        //write your code here
    }
}

 

package com.javapatterns.composite.drawingsafe;

public class Line extends Graphics
{
    public void draw()
    {
        //write your code here
    }
}

 

package com.javapatterns.composite.drawingsafe;

public class Rectangle extends Graphics
{
    public void draw()
    {
        //write your code here
    }
}

 

 

package com.javapatterns.composite.drawingsafe;

import java.util.Vector;

public class Picture extends Graphics
{
    /**
     * @uml.property  name="list"
     * @uml.associationEnd  multiplicity="(0 -1)" elementType="com.javapatterns.composite.drawingsafe.Graphics"
     */
    private Vector list = new Vector(10);

    public void draw()
    {
        for (int i = 0 ; i < list.size(); i++)
        {
            Graphics g = (Graphics) list.get(i);

            g.draw();
        }
    }

    public void add(Graphics g)
    {
        list.add(g);
    }

    public void remove(Graphics g)
    {
        list.remove(g);
    }

    public Graphics getChild(int i)
    {
        return (Graphics) list.get(i);
    }
}

 

另一个例子(透明式组合模式):

image

package com.javapatterns.composite.drawingtransparent;

abstract public class Graphics
{
    public abstract void draw();

    public abstract void add(Graphics g);

    public abstract void remove(Graphics g);

    public abstract Graphics getChild(int i);
}

 

package com.javapatterns.composite.drawingtransparent;

public class Circle extends Graphics
{
    public void draw()
    {
        //write your code here
    }

    public void add(Graphics g)
    {
        //do nothing
    }

    public void remove(Graphics g)
    {
        //do nothing
    }

    public Graphics getChild(int i)
    {
        return null;
    }
}

 

package com.javapatterns.composite.drawingtransparent;

public class Line extends Graphics
{
    public void draw()
    {
        //write your code here
    }

    public void add(Graphics g)
    {
        //do nothing
    }

    public void remove(Graphics g)
    {
        //do nothing
    }

    public Graphics getChild(int i)
    {
        return null;
    }
}

 

 

package com.javapatterns.composite.drawingtransparent;

public class Rectangle extends Graphics
{
    public void draw()
    {
        //write your code here
    }

    public void add(Graphics g)
    {
        //do nothing
    }

    public void remove(Graphics g)
    {
        //do nothing
    }

    public Graphics getChild(int i)
    {
        return null;
    }
}

package com.javapatterns.composite.drawingtransparent;

import java.util.Vector;

public class Picture extends Graphics
{
    /**
     * @uml.property  name="list"
     * @uml.associationEnd  multiplicity="(0 -1)" elementType="com.javapatterns.composite.drawingtransparent.Graphics"
     */
    private Vector list = new Vector(10);

    public void draw()
    {
        for (int i = 0 ; i < list.size(); i++)
        {
            Graphics g = (Graphics) list.get(i);

            g.draw();
        }
    }

    public void add(Graphics g)
    {
        list.add(g);
    }

    public void remove(Graphics g)
    {
        list.remove(g);
    }

    public Graphics getChild(int i)
    {
        return (Graphics) list.get(i);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的麦田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值