组合模式 Composite

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

DF对装饰模式的说明是这样的:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

 

个人认为 组合模式 和 装饰模式 很像。都是通过类似于setComposite的方法进行类似于递归的组装。但是 组合模式中的setComposite方法可以多次调用存入List中。而装饰模式只是组装一个对象,即用setComposite装载一个兄弟类的对象。之所以有这样的区别,是因为他们的出发点不同。组合模式是为了组装树形结构,所以使用List存储子节点。而装饰模式是为了赋予对象额外的职责而采用这种装载别的兄弟类的对象的方法。

 

组合模式感觉有点像 递归的感觉。组合模式可以简单的组装成树形结构。

AbstractModel类是 VDO类 和 NameSpace类 的父类。

VDO类是 LocalClass类 和 Message类 的父类。

其中AbstractModel是个抽象类。

package com.wjy.decorator;

public abstract class AbstractModel {
public abstract void setColor();
}
package com.wjy.decorator;

public class Vdo extends AbstractModel {

    @Override
    public void setColor() {
        // TODO Auto-generated method stub
    }

}
package com.wjy.decorator;

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

public class Namespace extends AbstractModel {

    List<AbstractModel> modleList=new ArrayList<AbstractModel>();
    @Override
    public void setColor() {
        // TODO Auto-generated method stub
        for (AbstractModel model : modleList) {
            model.setColor();
        }
    }
    
    public void SetComponent(AbstractModel abstractModel)
    {
        modleList.add(abstractModel);
    }

}
package com.wjy.decorator;

public class LocalClass extends Vdo {

    String vdoname;
    public LocalClass(String vdoname)
    {
        this.vdoname=vdoname;
    }
    @Override
    public void setColor() {
        // TODO Auto-generated method stub
        System.out.println("LocalClass "+vdoname+" 已经着色。");
    }

}
package com.wjy.decorator;

public class Message extends Vdo {
    String vdoname;
    public Message(String vdoname)
    {
        this.vdoname=vdoname;
    }
    @Override
    public void setColor() {
        // TODO Auto-generated method stub
        System.out.println("Message "+vdoname+" 已经着色。");
    }
}

Main函数如下:

package com.wjy.decorator;

public class start {
 public static void main(String[] args){
     LocalClass localClass1=new LocalClass("LocalClass1");
     LocalClass localClass2=new LocalClass("LocalClass2");
     Message message1=new Message("Message1");
     Message message2=new Message("Message2");
     Namespace namespace1=new Namespace();
     Namespace namespace2=new Namespace();
     Namespace namespace3=new Namespace();
     
     namespace2.SetComponent(localClass1);
     namespace2.SetComponent(localClass2);
     namespace2.SetComponent(message2);
     
     namespace3.SetComponent(message1);
     
     namespace1.SetComponent(namespace3);
     namespace1.SetComponent(namespace2);
     
     
     
     namespace1.setColor();
 }
}

/*
 *    树形结构图如下:
 *   ----namespace1
 *       ------namespace2
 *             ------localclass1
 *             ------localclass2
 *             ------message1
 *       ------namespace3
 *             ------message2
*/
/*
 *    运行结果:
 *           Message Message1 已经着色。
             LocalClass LocalClass1 已经着色。
             LocalClass LocalClass2 已经着色。
             Message Message2 已经着色。

*/

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值