1    代码演练

1.1    代码演练1(组合模式1)

1.2    代码演练2(组合模式1之完善)

1    代码演练
1.1    代码演练1(组合模式1)

需求:

打印出木木网的课程结构,

我们用一个组建类作为接口,课程类和目录类继承。

uml:

组件类:

package com.geely.design.pattern.structural.composite;

import java.io.IOException;

/**
* 课程目录组件,可以被课程和课程目录继承
*/
public abstract class CatalogComponent {
//添加目录
public void addCatalog(CatalogComponent catalogComponent){
throw new UnsupportedOperationException("不支持添加操作");
} //移除目录
public void removeCatalog(CatalogComponent catalogComponent){
throw new UnsupportedOperationException("不支持移除操作");
} //得到课程名称
public String getName(CatalogComponent catalogComponent){
throw new UnsupportedOperationException("不支持获取名称操作");
} //得到课程价格
public double getPrice(CatalogComponent catalogComponent){
throw new UnsupportedOperationException("不支持获取价格操作");
} //打印目录 注意这里抛出异常 是为了抽象类 的方法不被调取,之所以没有写抽象方法,是因为目录类和课程类总有些方法没有实现
public void printCatalog(){
throw new UnsupportedOperationException("不支持的操作");
}
}

课程类:

package com.geely.design.pattern.structural.composite;

public class Course extends CatalogComponent {
private String sCourseName;
private double sCoursePrice; public Course(String sCourseName, double sCoursePrice) {
this.sCourseName = sCourseName;
this.sCoursePrice = sCoursePrice;
} @Override
public String getName(CatalogComponent catalogComponent) {
return this.sCourseName;
} @Override
public double getPrice(CatalogComponent catalogComponent) {
return this.sCoursePrice;
} @Override
public void printCatalog() {
System.out.println("课程名称为"+sCourseName+", 课程价格为"+sCoursePrice);
}
}

目录类:

package com.geely.design.pattern.structural.composite;

import java.util.ArrayList;
import java.util.List; public class CourseCatalog extends CatalogComponent {
private List<CatalogComponent> items = new ArrayList<CatalogComponent>();
private String name; /**
* 一定要写有参构造方法,因为后边还要打印日志
* @param name
*/
public CourseCatalog(String name) {
this.name = name;
} @Override
public void addCatalog(CatalogComponent catalogComponent) {
items.add(catalogComponent);
} @Override
public void removeCatalog(CatalogComponent catalogComponent) {
items.remove(catalogComponent);
} /**
* 对于目录来说,课程名字可以出重写,
* 所以这里可以进行修改!!!
* @param catalogComponent
* @return
*/
@Override
public String getName(CatalogComponent catalogComponent) {
return this.name;
} @Override
public void printCatalog() {
for(CatalogComponent catalogComponent :items){
catalogComponent.printCatalog();
}
}
}

测试类:

package com.geely.design.pattern.structural.composite;

public class Test {

    public static void main(String [] args){
CatalogComponent totalCourse = new CourseCatalog("课程总目录");
CatalogComponent linuxCourse = new Course("linux课程",11);
CatalogComponent windowsCourse = new Course("windows操作系统课程",22);
CatalogComponent javaCatalog = new CourseCatalog("java课程目录");
CatalogComponent javaHibernate = new Course("hibernate课程",33);
CatalogComponent javaStruct2 = new Course("Struct2课程",44);
CatalogComponent javaSpring = new Course("Spring课程",55);
javaCatalog.addCatalog(javaHibernate);
javaCatalog.addCatalog(javaStruct2);
javaCatalog.addCatalog(javaSpring);
totalCourse.addCatalog(linuxCourse);
totalCourse.addCatalog(windowsCourse);
totalCourse.addCatalog(javaCatalog);
totalCourse.printCatalog();
}
}

打印日志:

课程名称为linux课程,  课程价格为11.0
课程名称为windows操作系统课程, 课程价格为22.0
课程名称为hibernate课程, 课程价格为33.0
课程名称为Struct2课程, 课程价格为44.0
课程名称为Spring课程, 课程价格为55.0 Process finished with exit code 0
1.2    代码演练2(组合模式1之完善)

1.1的缺陷是

没有打出目录结构

只修改了课程目录类 和测试类:

package com.geely.design.pattern.structural.composite;

import java.util.ArrayList;
import java.util.List; public class CourseCatalog extends CatalogComponent {
private List<CatalogComponent> items = new ArrayList<CatalogComponent>();
private String name;
private Integer level;//加入等级, 判断是否是目录,之所以不用int 是因为不用给它初始值, 也好做空判断

/**
* 一定要写有参构造方法,因为后边还要打印日志
* @param name
*/
public CourseCatalog(String name,Integer level) {
this.name = name;
this.level = level;
} @Override
public void addCatalog(CatalogComponent catalogComponent) {
items.add(catalogComponent);
} @Override
public void removeCatalog(CatalogComponent catalogComponent) {
items.remove(catalogComponent);
} /**
* 对于目录来说,课程名字可以出重写,
* 所以这里可以进行修改!!!
* @param catalogComponent
* @return
*/
@Override
public String getName(CatalogComponent catalogComponent) {
return this.name;
} @Override
public void printCatalog() {
System.out.println(this.name);//打印目录名字
for(CatalogComponent catalogComponent :items){
if(this.level != null){
for(int i = 0;i < level;i++){
System.out.print(" "
);
}
}

catalogComponent.printCatalog();//调用课程或者目录打印方法
}
}
}

测试类:

package com.geely.design.pattern.structural.composite;

public class Test {

    public static void main(String [] args){
CatalogComponent totalCourse = new CourseCatalog("课程总目录",1);
CatalogComponent linuxCourse = new Course("linux课程",11);
CatalogComponent windowsCourse = new Course("windows操作系统课程",22);
CatalogComponent javaCatalog = new CourseCatalog("java课程目录",2);
CatalogComponent javaHibernate = new Course("hibernate课程",33);
CatalogComponent javaStruct2 = new Course("Struct2课程",44);
CatalogComponent javaSpring = new Course("Spring课程",55);
javaCatalog.addCatalog(javaHibernate);
javaCatalog.addCatalog(javaStruct2);
javaCatalog.addCatalog(javaSpring);
totalCourse.addCatalog(linuxCourse);
totalCourse.addCatalog(windowsCourse);
totalCourse.addCatalog(javaCatalog);
totalCourse.printCatalog();
}
}

打印日志:

课程总目录
课程名称为linux课程, 课程价格为11.0
课程名称为windows操作系统课程, 课程价格为22.0
java课程目录
课程名称为hibernate课程, 课程价格为33.0
课程名称为Struct2课程, 课程价格为44.0
课程名称为Spring课程, 课程价格为55.0 Process finished with exit code 0

课程类:

package com.geely.design.pattern.structural.composite;

public class Course extends CatalogComponent {
private String sCourseName;
private double sCoursePrice; public Course(String sCourseName, double sCoursePrice) {
this.sCourseName = sCourseName;
this.sCoursePrice = sCoursePrice;
} @Override
public String getName(CatalogComponent catalogComponent) {
return this.sCourseName;
} @Override
public double getPrice(CatalogComponent catalogComponent) {
return this.sCoursePrice;
} @Override
public void printCatalog() {
System.out.println("课程名称为"+sCourseName+", 课程价格为"+sCoursePrice);
}
}

组件类:

package com.geely.design.pattern.structural.composite;

import java.io.IOException;

/**
* 课程目录组件,可以被课程和课程目录继承
*/
public abstract class CatalogComponent {
//添加目录
public void addCatalog(CatalogComponent catalogComponent){
throw new UnsupportedOperationException("不支持添加操作");
} //移除目录
public void removeCatalog(CatalogComponent catalogComponent){
throw new UnsupportedOperationException("不支持移除操作");
} //得到课程名称
public String getName(CatalogComponent catalogComponent){
throw new UnsupportedOperationException("不支持获取名称操作");
} //得到课程价格
public double getPrice(CatalogComponent catalogComponent){
throw new UnsupportedOperationException("不支持获取价格操作");
} //打印目录 注意这里抛出异常 是为了抽象类 的方法不被调取,之所以没有写抽象方法,是因为目录类和课程类总有些方法没有实现
public void printCatalog(){
throw new UnsupportedOperationException("不支持的操作");
}
}

最新文章

  1. C++中的时间函数
  2. UWP Composition API - 锁定列的FlexGrid
  3. BestCoder Round #43
  4. [Unity3D] 和Unity3D的一些事
  5. Android--Intent的使用
  6. Spark官方文档——独立集群模式(Standalone Mode)
  7. css图片切换效果分析+翻译整理
  8. 在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static
  9. CentOS系统安全配置
  10. 邮件应用Acompli和日历应用Sunrise(传微软曾考虑以80亿美元收购企业通讯公司Slack)
  11. iOS根据网络图片的size大小设置UIImageView的大小
  12. 如何完全根据官方下载包搭建hibernate框架
  13. 1c19b35b005744d55261682b361804fa 这个是MD5
  14. ORA-00936: missing expression
  15. 环境搭建 - Java(Windows)
  16. CSS-动画巧用translated3d
  17. 用WSDL4J解析types标签中的内容
  18. openstack之cinder_backup对接ceph存储
  19. 【LeetCode每天一题】Find First and Last Position of Element in Sorted Array(找到排序数组中指定元素的开始和结束下标)
  20. [转]Greenplum的工作负载及资源管理

热门文章

  1. powermt命令介绍
  2. PTA的Python练习题(十八)
  3. Python(四)生成器 和 杨辉三角
  4. 学习笔记(22)- plato-训练端到端的模型
  5. 4 中文乱码 selenium的使用
  6. C语言:假定输入的字符串只包含字母和*号,fun函数:除了尾部的*号以外,将字符的其他*号进行全部删除,形参p已经指向字符串中最后一个字母。-利用折半查找整数m在有序数组中的位置,若找到,返回下标值,否则返回-1。
  7. 2020年python学习进阶方向
  8. docker安装-单机/多机安装
  9. Python爬虫:urllib库的基本使用
  10. python2.7环境下升级pip3,及出错解决办法