Java 设计模式--组合模式

本设计模式资料源于慕课网,讲师:Geely 《Java设计模式精讲 Debug方式+内存分析》,本人作为自己手打整理作为学习的归纳总结。

一,模式介绍

1,定义和类型

  • 将对象组合成树形结构以表示“部分-整体”的层次结构
  • 组合模式使客户端对单个对象和组合对象保持一致的方式处理
  • 类型:结构型

2,适用场景

  • 希望客户端可以忽略组合对象和单个对象的差异时
  • 处理一个树型结构时

3,优点

  • 清楚地定义分层次的复杂对象,表示对象的全部或部分层次
  • 让客户端忽略了层次的差异,方便对整个层次结构进行控制
  • 简化客户端代码
  • 符合开闭原则

4,缺点

  • 限制类型时会较为复杂
  • 使设计变得更加抽象

二,代码演示

  • 业务场景
    需要设计课程的目录结构
package com.try1.design.structural.composite;

public abstract class CatalogComponent {
    public void add(CatalogComponent catalogComponent){
        throw new UnsupportedOperationException("不支持增加操作");
    }
    public void remove(CatalogComponent catalogComponent){
        throw new UnsupportedOperationException("不支持删除操作");
    }
    public String getName(CatalogComponent catalogComponent){
        throw new UnsupportedOperationException("不支持获取名称操作");
    }
    public Double getPrice(CatalogComponent catalogComponent){
        throw new UnsupportedOperationException("不支持获取价格操作");
    }
    public void print(){
        throw new UnsupportedOperationException("不支持打印操作");
    }

}

package com.try1.design.structural.composite;

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

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

    @Override
    public String getName(CatalogComponent catalogComponent) {
        return this.name;
    }

    @Override
    public Double getPrice(CatalogComponent catalogComponent) {
        return this.price;
    }

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

package com.try1.design.structural.composite;

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

public class CourseCatalog extends CatalogComponent {
    public List<CatalogComponent> items=new ArrayList<CatalogComponent>();
    private String name;
    private Integer level;

    public CourseCatalog(String name,Integer level) {
        this.name = name;
        this.level=level;
    }

    @Override
    public void add(CatalogComponent catalogComponent) {
        items.add(catalogComponent);
    }

    @Override
    public void remove(CatalogComponent catalogComponent) {
        items.remove(catalogComponent);
    }

    @Override
    public void print() {
        System.out.println(this.name);
        for (CatalogComponent catalogComponent: items) {
            if(this.level!=null){
                for (int i = 0; i < this.level; i++) {
                    System.out.print(" ");
                }
            }
            catalogComponent.print();
        }
    }
}

package com.try1.design.structural.composite;

public class Test {
    public static void main(String[] args) {
        CatalogComponent linuxCourse=new Course("Linux课程",11);
        CatalogComponent windowsCourse=new Course("Windows课程",11);

        CatalogComponent javaCourseCatalog=new CourseCatalog("Java课程目录",2);

        CatalogComponent mmallCourse1=new Course("Java电商一期",55);
        CatalogComponent mmallCourse2=new Course("Java电商二期",55);
        CatalogComponent designPattern=new Course("Java设计模式",66);

        javaCourseCatalog.add(mmallCourse1);
        javaCourseCatalog.add(mmallCourse2);
        javaCourseCatalog.add(designPattern);

        CatalogComponent imoocMainCourseCatalog=new CourseCatalog("慕课网课程总目录",1);
        imoocMainCourseCatalog.add(linuxCourse);
        imoocMainCourseCatalog.add(windowsCourse);
        imoocMainCourseCatalog.add(javaCourseCatalog);

        imoocMainCourseCatalog.print();
    }
}

三,总结

  • 组合模式的本质是实现类于实现的嵌套,然后根据实现程度的不同,进行在本例中的目录分级操作实现目录管理,但是组合也正因为这一点会在嵌套上变得复杂。
  • 实现因为都是实现于同一个组件抽象类,在最后的测试中也可以全部用这个组件来接,实现了代码的最少知道的整合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值