设计模式之组合模式(Composite)(结构型)
1.场景模拟
使用软件模拟大树的根节点和树枝节点和叶子节点
抽象为两类,容器节点和叶子节点
2.不用模式的解决方案
package demo14.composite.example1; import java.util.*; /** * 组合对象,可以包含其它组合对象或者叶子对象 */ public class Composite { /** * 用来记录包含的其它组合对象 */ private Collection<Composite> childComposite = new ArrayList<Composite>(); /** * 用来记录包含的其它叶子对象 */ private Collection<Leaf> childLeaf = new ArrayList<Leaf>(); /** * 组合对象的名字 */ private String name = ""; /** * 构造方法,传入组合对象的名字 * @param name 组合对象的名字 */ public Composite(String name){ this.name = name; } /** * 向组合对象加入被它包含的其它组合对象 * @param c 被它包含的其它组合对象 */ public void addComposite(Composite c){ this.childComposite.add(c); } /** * 向组合对象加入被它包含的叶子对象 * @param leaf 被它包含的叶子对象 */ public void addLeaf(Leaf leaf){ this.childLeaf.add(leaf); } /** * 输出组合对象自身的结构 * @param preStr 前缀,主要是按照层级拼接的空格,实现向后缩进 */ public void printStruct(String preStr){ //先把自己输出去 System.out.println(preStr+"+"+this.name); //然后添加一个空格,表示向后缩进一个空格,输出自己包含的叶子对象 preStr+=" "; for(Leaf leaf : childLeaf){ leaf.printStruct(preStr); } //输出当前对象的子对象了 for(Composite c : childComposite){ //递归输出每个子对象 c.printStruct(preStr); } } } *********************************************************************************************** package demo14.composite.example1; /** * 叶子对象 */ public class Leaf { /** * 叶子对象的名字 */ private String name = ""; /** * 构造方法,传入叶子对象的名字 * @param name 叶子对象的名字 */ public Leaf(String name){ this.name = name; } /** * 输出叶子对象的结构,叶子对象没有子对象,也就是输出叶子对象的名字 * @param preStr 前缀,主要是按照层级拼接的空格,实现向后缩进 */ public void printStruct(String preStr){ System.out.println(preStr+"-"+name); } } *************************************************************************************************** package demo14.composite.example1; public class Client { public static void main(String[] args) { // 定义所有的组合对象 Composite root = new Composite("服装"); Composite c1 = new Composite("男装"); Composite c2 = new Composite("女装"); // 定义所有的叶子对象 Leaf leaf1 = new Leaf("衬衣"); Leaf leaf2 = new Leaf("夹克"); Leaf leaf3 = new Leaf("裙子"); Leaf leaf4 = new Leaf("套装"); // 按照树的结构来组合组合对象和叶子对象 root.addComposite(c1); root.addComposite(c2); c1.addLeaf(leaf1); c1.addLeaf(leaf2); c2.addLeaf(leaf3); c2.addLeaf(leaf4); // 调用根对象的输出功能来输出整棵树 root.printStruct(""); } }
补充:软件开发 , Java ,