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 已经着色。 */