组合模式
组合模式适用于“部分-整体”的关系。简而言之,通过树形结构来构建。
例子以一个课程的树形构建为例。
比如,我们有 Java 入门教程、SSM教程、Java设计模式、源码分析、软技能等,而 Java 设计模式、源码分析、软技能也可以属于 Java 架构师系列教程包,每个教程的定价都不一样。但是,这些教程不论怎么组合,都有一些共性,而且是整体和部分的关系,所以可以用组合模式来设计。
代码如下
public class CourseComponentTest {
public static void main(String[] args) {
System.out.println("============组合模式==============");
CourseComponent javaBase = new Course("Java入门教程", 8280);
CourseComponent ssm = new Course("SSM", 5000);
CourseComponent packageCourse = new CoursePackage("Java架构师教程", 2);
CourseComponent design = new Course("Java设计模式", 1500);
CourseComponent source = new Course("源码分析", 2000);
CourseComponent softSkill = new Course("软技能", 3000);
packageCourse.add(design);
packageCourse.add(source);
packageCourse.add(softSkill);
CourseComponent catalog = new CoursePackage("教程目录", 1);
catalog.add(javaBase);
catalog.add(ssm);
catalog.add(packageCourse);
catalog.print();
}
}
// 抽象类,顶层组件
abstract class CourseComponent {
public void add(CourseComponent Component) {
throw new UnsupportedOperationException("不支持添加操作");
}
public void remove(CourseComponent Component) {
throw new UnsupportedOperationException("不支持删除操作");
}
public String getName(CourseComponent Component) {
throw new UnsupportedOperationException("不支持获取名称操作");
}
public double getPrice(CourseComponent Component) {
throw new UnsupportedOperationException("不支持获得价格操作");
}
public void print() {
throw new UnsupportedOperationException("不支持打印操作");
}
}
// 具体课程类
class Course extends CourseComponent {
private String name;
private double price;
public Course(String name, double price) {
this.name = name;
this.price = price;
}
@Override
public String getName(CourseComponent Component) {
return this.name;
}
@Override
public double getPrice(CourseComponent Component) {
return this.price;
}
@Override
public void print() {
System.out.println(name + "(¥" + price + "元)");
}
}
// 课程具体类
class CoursePackage extends CourseComponent{
private List<CourseComponent> itmes = new ArrayList<CourseComponent>();
private String name;
private Integer level;
public CoursePackage(String name, Integer level) {
this.name = name;
this.level = level;
}
@Override
public void add(CourseComponent Component) {
itmes.add(Component);
}
@Override
public void remove(CourseComponent Component) {
itmes.remove(Component);
}
@Override
public String getName(CourseComponent Component) {
return this.name;
}
@Override
public void print() {
System.out.println(this.name);
for (CourseComponent c : itmes) {
if (this.level != null) {
for (int i = 0; i < this.level; i++) {
System.out.print(" ");
}
for (int i = 0; i < this.level; i++) {
if (i == 0) {
System.out.print("+");
}
System.out.print("-");
}
}
c.print();
}
}
}
在实际的应用场景里,公司与部门的关系,菜单与子菜单之间的关系都是用的组合模式。
参考资料:
1.http://c.biancheng.net/view/1373.html
代码地址:https://gitee.com/zhoujie1/design-mode-and-principle.git