使用透明组合模式实现课程目录结构
本节以 新宝库的教程为例,设计一个教程的关系结构。比如,我们有 Java 入门教程、SSM教程、Java设计模式、源码分析、软技能等,而 Java 设计模式、源码分析、软技能也可以属于 Java 架构师系列教程包,每个教程的定价都不一样。但是,这些教程不论怎么组合,都有一些共性,而且是整体和部分的关系,所以可以用组合模式来设计。
首先创建一个顶层的抽象组件 CourseComponent。
可能这里有些小伙伴会有疑惑,为什么不用抽象方法?因为用了抽象方法,其子类就必须实现,这样便体现不出各子类的细微差异了。所以子类继承此抽象类后,只需要重写有差异的方法覆盖父类的方法即可。
然后分别创建教程 Course 类和教程包 CoursePackage 类。创建 Course 类的代码如下。
首先创建一个顶层的抽象组件 CourseComponent。
public 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("不支持打印操作"); } }把所有可能用到的方法都定义到这个顶层的抽象组件中,但是不写任何逻辑处理的代码,而是直接抛异常。
可能这里有些小伙伴会有疑惑,为什么不用抽象方法?因为用了抽象方法,其子类就必须实现,这样便体现不出各子类的细微差异了。所以子类继承此抽象类后,只需要重写有差异的方法覆盖父类的方法即可。
然后分别创建教程 Course 类和教程包 CoursePackage 类。创建 Course 类的代码如下。
public 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 + "元)"); } }创建 CoursePackage 类的代码如下。
import java.util.ArrayList; import java.util.List; public 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(); } } }最后编写客户端测试代码。
public class Test { 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(); } }运行结果如下所示。
============透明的组合模式==============
新宝库教程目录
+-Java入门教程(¥8280.0元)
+-SSM(¥5000.0元)
+-Java架构师教程
+--Java设计模式(¥1500.0元)
+--源码分析(¥2000.0元)
+--软技能(¥3000.0元)
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算