• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

组合模式

开发技术 开发技术 1周前 (05-04) 8次浏览

定义:组合模式是一个整体部分的概念,可以与聚合对比理解,聚合个体与整体之间并无强依赖关系,不属于一个体系,比如电脑U盘的使用,u盘可以独立存在,不属于电脑结构体系。而组合模式则是所有对象属于一个结构体系,例如菜单的树形结构,上面的每一道菜如果独立出菜单则无法被定位。

生活中公司的组织架构,电脑的文件夹层级关系,这都都是属于组合结构。而使用组合结构的设计模式,会使得对象结构层次清晰,不会出现循环嵌套的引用结构。

比如文件系统,不需要在每一个文件中定义它属于哪一个文件夹,便不会导致结构层次过于复杂。

例如如下模式,深层嵌套的时候出现这种结构非常麻烦,特别是做循环遍历的时候,这里就非常适合使用组合模式,降低空间复杂度,mapping文件的标签使用就是这种思想

List<List<List<List<List>>>>

写法:

 

写法:定义一个抽象类,但是只定义一个通用的方法,方法入参为抽象引用,子类具体的功能实现由子类自己实现,不过最后都是由抽象的方法统一调用。

源码中使用:HashMap.addAll()和ArrayList.addAll()方法以及mybaitis中的mapping文件中的每一个标签,都抽象与SQLNode,都是使用了组合模式,使得复杂的代码结构层次清晰

package group;

/**

  • 定义一个顶层抽象类,北凉军营
    */
    public abstract class BeiLiang {

    /**

    • 定义一个公共属性
      */
      protected String name;

    /**

    • 定义一个抽象方法 方法入参为顶层抽象Directory,不论是北凉军营,还是北凉军,都有一个共同功能,拒北
      */
      public abstract void rejectNorth();

    public BeiLiang(String name) {
    this.name = name;
    }
    }

package group;

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

/**

  • 拒北城
    */
    public class RejectNorthCity extends BeiLiang {

    private List beiliangjun = new ArrayList<>();

    /**

    • 军营定级
      /
      private Integer level;
      /
      *
    • 调用抽象的构造方法,使用抽象类的name属性
    • @param name
      */
      public RejectNorthCity(String name, Integer level) {
      super(name);
      this.level = level;
      }

    public void addJun(BeiLiang beiLiang){
    beiliangjun.add(beiLiang);
    }

    @Override
    public void rejectNorth() {
    for(BeiLiang beiLiang: beiliangjun){
    beiLiang.rejectNorth();
    }
    System.out.println(this.name);
    }
    }

package group;

/**

  • 定义一个文件类,通用继承顶层抽象类,中原宗师
    */
    public class ZhongYuanGuru extends BeiLiang {
    public ZhongYuanGuru(String name) {
    super(name);
    }

    @Override
    public void rejectNorth() {
    System.out.println(this.name);
    }
    }

package group;

public class test {

public static void main(String[] args) {
    BeiLiang xufengnian = new ZhongYuanGuru("徐凤年");
    BeiLiang caiqingshan = new ZhongYuanGuru("柴青山");
    BeiLiang loufang = new ZhongYuanGuru("楼荒");
    BeiLiang taohuajianshen = new ZhongYuanGuru("桃花剑神");

    /**
     * 柴青山,楼荒,桃花剑神在拒北城一站中数据拒北城关系
     */
    RejectNorthCity jubeicheng = new RejectNorthCity("拒北城",2);
    jubeicheng.addJun(caiqingshan);
    jubeicheng.addJun(loufang);
    jubeicheng.addJun(taohuajianshen);
    RejectNorthCity beiliang = new RejectNorthCity("北凉",1);
    /**
     * 拒北城属于北凉,北凉潘王徐凤年属于北凉
     */
    beiliang.addJun(jubeicheng);
    beiliang.addJun(xufengnian);


    beiliang.rejectNorth();
}

}

输出结构可以看出结构关系,输出方法处理一下打印,关系更明朗
组合模式


程序员灯塔
转载请注明原文链接:组合模式
喜欢 (0)