组合模式

This commit is contained in:
2020-02-29 09:29:10 +08:00
parent 09e04da200
commit 6b96a2cb99
4 changed files with 147 additions and 0 deletions

View File

@@ -0,0 +1,31 @@
package top.fjy8018.designpattern.pattern.structural.composite;
/**
* 课程抽象类
* 抽象组件应当多加考虑,哪些参数需要,哪些不需要
*
* @author F嘉阳
* @date 2020/2/28 16:19
*/
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("不支持获取打印操作");
}
}

View File

@@ -0,0 +1,35 @@
package top.fjy8018.designpattern.pattern.structural.composite;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* 课程
* 重写抽象类需要充分考虑业务逻辑
*
* @author F嘉阳
* @date 2020/2/28 16:24
*/
@Slf4j
@AllArgsConstructor
public class Course extends CatalogComponent {
private String name;
private Double price;
@Override
public String getName(CatalogComponent catalogComponent) {
return this.name;
}
@Override
public Double getPrice(CatalogComponent catalogComponent) {
return this.price;
}
@Override
public void print() {
log.info("课程名称:{},价格:{}", name, price);
}
}

View File

@@ -0,0 +1,41 @@
package top.fjy8018.designpattern.pattern.structural.composite;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
/**
* 课程目录
* 可以添加目录节点
*
* @author F嘉阳
* @date 2020/2/28 16:34
*/
@Slf4j
public class CourseCatalog extends CatalogComponent {
private List<CatalogComponent> items = new ArrayList<>();
private String name;
public CourseCatalog(String name) {
this.name = name;
}
@Override
public void add(CatalogComponent catalogComponent) {
items.add(catalogComponent);
}
@Override
public void remove(CatalogComponent catalogComponent) {
items.remove(catalogComponent);
}
@Override
public void print() {
log.info("课程目录名称:{}", name);
items.forEach(CatalogComponent::print);
}
}

View File

@@ -0,0 +1,40 @@
package top.fjy8018.designpattern.pattern.structural.composite;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
/**
* @author F嘉阳
* @date 2020/2/28 16:37
*/
@Slf4j
class CatalogComponentTest {
@Test
void add() {
// 将课程与课程目录都认为是同一个类型,进行统一处理
CatalogComponent linuxCourse = new Course("Linux课程", 35.0);
CatalogComponent windowsCourse = new Course("windows课程", 61.0);
CatalogComponent macOsCourse = new Course("macOs课程", 20.0);
CatalogComponent springCourse = new Course("spring课程", 55.0);
CatalogComponent servletCourse = new Course("servlet课程", 11.0);
// 课程目录
CatalogComponent javaCourseCatalog = new CourseCatalog("java课程目录");
CatalogComponent schoolCourseCatalog = new CourseCatalog("学校课程主目录");
javaCourseCatalog.add(springCourse);
javaCourseCatalog.add(servletCourse);
// 既可以添加课程,也可以添加目录
schoolCourseCatalog.add(linuxCourse);
schoolCourseCatalog.add(windowsCourse);
schoolCourseCatalog.add(macOsCourse);
schoolCourseCatalog.add(javaCourseCatalog);
schoolCourseCatalog.print();
}
}