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("不支持的操作");
}
}

设计模式课程 设计模式精讲 14-2 组合模式coding的更多相关文章

  1. 设计模式课程 设计模式精讲 11-2 装饰者模式coding

    1 代码演练 1.1 代码演练1(未使用装饰者模式) 1.2 代码演练2(使用装饰者模式) 1 代码演练 1.1 代码演练1(未使用装饰者模式) 需求: 大妈下班卖煎饼,加一个鸡蛋加一元,一个火腿两元 ...

  2. 设计模式课程 设计模式精讲 13-2 享元模式coding

    1 代码演练 1.1 代码演练1 1 代码演练 1.1 代码演练1 需求: 每周由随机部门经历做报告: 重点关注: a 该案例是单例模式和享元模式共同使用 b 外部传入的department是外部状态 ...

  3. 设计模式课程 设计模式精讲 7-2 建造者模式Coding

    1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作 ...

  4. 设计模式课程 设计模式精讲 17-2 模板方法模式coding

    1 代码演练 1.1 代码演练1 1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法) 1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?) 1 代码演练 1.1 ...

  5. 《javascript设计模式》笔记之第九章:组合模式

    之前一直都是按照书的结构顺序做总结,觉得好像不是很好,现在试着完全按照自己的理解做总结.例子还是书上的例子. 一:组合模式的作用: 在web开发中,主要用于创建嵌套的html结点,使得我们方便的把各种 ...

  6. CSharp设计模式读书笔记(9):组合模式(学习难度:★★★☆☆,使用频率:★★★★☆)

    组合模式(Composite Pattern): 组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构.组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可 ...

  7. Android设计模式系列(1)--SDK源码之组合模式

    Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用.在android UI设计,几乎所有的widget和布局类都依靠这两个类.组合模式,Compos ...

  8. Android开发用到的几种常用设计模式浅谈(一):组合模式

    1:应用场景 Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用.在android UI设计,几乎所有的widget和布局类都依靠这两个类.组合模式 ...

  9. 设计模式课程 设计模式精讲 6-2 抽象工厂coding

    1 代码讲解 1.1 抽象工厂优点 1.2 抽象工厂缺点 1.3 为何有产品族的业务场景宜用抽象工厂设计模式?而不是工厂设计模式? 2 代码演练 2.1 抽象工厂代码演练 1 代码讲解 1.1 抽象工 ...

随机推荐

  1. C语言程序设计(二)

    目录:   1.算法基本概念 2.认识循环语句 3.算法的表示法 4.求素数 5.求闰年 6.判断一个数是否为回文数 算法基本概念: (一)一个程序主要包含的2方面信息: 1.对数据的描述,在程序中要 ...

  2. 谈谈对Spring IOC的理解(转载)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  3. Laravel Vuejs 实战:开发知乎 (6)发布问题

    1.view部分: 安装一个扩展包:Laravel-UEditor composer require "overtrue/laravel-ueditor:~1.0" 配置 添加下面 ...

  4. 大数据计算引擎之Flink Flink CEP复杂事件编程

    原文地址: 大数据计算引擎之Flink Flink CEP复杂事件编程 复杂事件编程(CEP)是一种基于流处理的技术,将系统数据看作不同类型的事件,通过分析事件之间的关系,建立不同的时事件系序列库,并 ...

  5. 超长干货丨Kubernetes网络快速入门完全指南

    Kubernetes网络一直是一个非常复杂的主题.本文将介绍Kubernetes实际如何创建网络以及如何为Kubernetes集群设置网络. 本文不包括如何设置Kubernetes集群.这篇文章中的所 ...

  6. 01 认识python

    python介绍 python的创始⼈为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决⼼ 开发⼀个新的脚本解释程序,作为ABC语 ...

  7. Spring Boot 集成 Swagger2 教程

    上篇讲过 Spring Boot RESTful api ,这篇简单介绍下 SwaggerUI 在 Spring Boot 中的应用. Swagger 是一个规范和完整的框架,用于生成.描述.调用和可 ...

  8. Spring Boot Log 日志使用教程

    我们编写任何 Spring Boot 程序,可能绕不开的就是 log 日志框架(组件). 在大多数程序员眼中日志是用来定位问题的.这很重要. 本项目源码下载 注意本项目提供的源码已在后期重新编写,有部 ...

  9. Vue——解决移动端键盘弹起导致的页面fixed定位元素布局错乱

    最近做了一个移动端项目,页面主体是由form表单和底部fixed定位的按钮组成,当用户进行表单输入时,手机软键盘弹起,此时页面的尺寸发生变化,底部fixed定位的元素自然也会上移,可能就会覆盖页面中的 ...

  10. JPA 级联保存的问题

    前提:系统有学校-学生关系,学校可以包含多个学生,学生只能属于一个学校 在使用 spring-data-jpa 的时候,保存学校的同时保存学生信息,不需要先逐个保存学生信息,再将学生信息放在学校中保存 ...