设计模式-结构型-组合模式

Posted by YaPi on May 10, 2018

基础与定义

  • 将对象组合成树形结构以表示 部分-整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性
  • 组合模式使客户端对单个对西那个和组合对象保持一致的方式处理
  • 就是将多个对象组合成一个对象,简化对对象的访问
  • 类型:结构型

使用场景

  1. 处理一个树形结构
  2. 希望客户端可以忽略组合对象与单个对象的差异时

优点:

  1. 清楚的定义层次的复杂对象
  2. 让客户端忽略来层次的差异
  3. 符合开闭原则

缺点:

  1. 限制类型时较为复杂
  2. 设计更加抽象
源码实例
  1. map 中的 putAll
  2. arrayList 中的 addAll
代码实例
public abstract class CatelogComponet {
    public void add(CatelogComponet catelogComponet){
        throw new UnsupportedOperationException("不支持添加操作");
    }

    public void remove(CatelogComponet catelogComponet){
        throw new UnsupportedOperationException("不支持删除操作");
    }

    public String getName(CatelogComponet catelogComponet){
        throw new UnsupportedOperationException("不支持获取名称操作");
    }

    public double getPrice(CatelogComponet catelogComponet){
        throw new UnsupportedOperationException("不支持获取价格添加操作");
    }

    public void print(){
        throw new UnsupportedOperationException("不支持打印操作");
    }
}


public class Course extends CatelogComponet {
    private String name;
    private double price;

    public Course(String name, double price) {
        this.name = name;
        this.price = price;
    }

    @Override
    public String getName(CatelogComponet catelogComponet) {
        return this.name;
    }

    @Override
    public double getPrice(CatelogComponet catelogComponet) {
        return this.price;
    }

    @Override
    public void print() {
        System.out.println("Course Name :"+name+" price :"+price);
    }
}

public class CourseCatelog extends CatelogComponet {
    private List<CatelogComponet> items = new ArrayList<>();
    private String name;

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

    @Override
    public String getName(CatelogComponet catelogComponet) {
        return name;
    }

    @Override
    public void add(CatelogComponet catelogComponet) {
        items.add(catelogComponet);
    }

    @Override
    public void remove(CatelogComponet catelogComponet) {
        items.remove(catelogComponet);
    }

    @Override
    public void print() {
        System.out.println(this.name);
        for (CatelogComponet c : items){
            System.out.print("  ");
            c.print();
        }
    }
}


public class Test {
    public static void main(String[] args){
        CatelogComponet linuxCourse = new Course("linux",11);
        CatelogComponet windowsCourse = new Course("windows",11);

        CatelogComponet javaCatelog= new CourseCatelog("java");

        CatelogComponet javaCatelog1 = new Course("java 1",11);
        CatelogComponet javaCatelog2 = new Course("java 2",22);
        CatelogComponet javaCatelog3 = new Course("java 3",44);

        // 添加课程到课程目录
        javaCatelog.add(javaCatelog1);
        javaCatelog.add(javaCatelog2);
        javaCatelog.add(javaCatelog3);

        CatelogComponet immocMainCourse = new CourseCatelog("主目录");

        immocMainCourse.add(linuxCourse);
        immocMainCourse.add(windowsCourse);
        immocMainCourse.add(javaCatelog);

        immocMainCourse.print();

    }
}