目录
一、组合模式的定义与类型
- 一、组合模式的定义与类型
- 二、组合模式的适用场景
- 三、组合模式的优点
- 四、组合模式的缺点
- 五、组合模式相关的设计模式
- 六、组合模式示例
1、定义
- 将对象组合成树形结构以表示“部分-整体”的层次结构
- 组合模式使客户端对单个对象和组合对象保持一致的方式处理
2、类型
- 结构型
- 希望客户端可以忽略组合对象与单个对象的差异时
- 处理一个树形结构时
- 清楚的定义分层次的复杂对象,表示对象的全部或部分层次
- 让客户端忽略了层次的差异,方便对整个层次结构进行控制
- 简化客户端代码
- 符合开闭原则
- 限制类型时会较为复杂
- 使设计变得更加抽象
- 组合模式和访问者模式
示例描述:以课程和课程组成的课程目录为例。
1、创建一个抽象的目录组件类:
package com.rf.designPatterns.structural.composite;
/**
* @description: 创建一个抽象的目录组件类
* @author: xiaozhi
* @create: 2020-07-09 10:39
*/
public abstract class CatalogComponent {
public void insert(CatalogComponent catalogComponent){
throw new UnsupportedOperationException("不支持添加目录操作");
}
public void delete(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("不支持打印目录操作");
}
}
2、创建一个课程类
package com.rf.designPatterns.structural.composite;
/**
* @description: 创建一个课程类
* @author: xiaozhi
* @create: 2020-07-09 10:45
*/
public class Cource extends CatalogComponent{
private String name; //课程名称
private Double price; //课程价格
public Cource(String name, Double price) {
this.name = name;
this.price = price;
}
@Override
public String getName(CatalogComponent catalogComponent) {
return this.name;
}
@Override
public Double getPrice(CatalogComponent catalogComponent) {
return this.price;
}
@Override
public void print() {
System.out.println("课程的名称:"+name+",价格:"+price);
}
}
3、创建一个课程目录类
package com.rf.designPatterns.structural.composite;
import java.util.ArrayList;
import java.util.List;
/**
* @description: 创建一个课程目录类
* @author: xiaozhi
* @create: 2020-07-09 10:59
*/
public class CourseCatalog extends CatalogComponent{
private List list=new ArrayList();
private String name; //课程目录名称
private Integer level;课程目录等级
public CourseCatalog(String name,Integer level) {
this.name = name;
this.level=level;
}
@Override
public void insert(CatalogComponent catalogComponent) {
list.add(catalogComponent);
}
@Override
public void delete(CatalogComponent catalogComponent) {
list.remove(catalogComponent);
}
@Override
public String getName(CatalogComponent catalogComponent) {
return this.name;
}
@Override
public void print() {
System.out.println(this.name);
for(CatalogComponent item :list){
if(this.level!=null){
for(int i=0;i
关注
打赏
热门博文
- Netty——网络编程 NIO(Selector处理accept事件)代码示例
- CompletableFuture异步编排(多任务组合)
- CompletableFuture异步编排(线程串行化代码示例)
- CompletableFuture异步编排(handle最终处理)
- CompletableFuture异步编排(计算完成回调代码示例)
- hutool工具导出excel代码示例
- java 获取音频、视频文件时长代码示例
- PostMan发送请求参数带有路径特殊字符会返回400错误(与URL字符及URL编码值有关)
- Rabbitmq与Erlang安装包下载图解
- idea2021.1版本SpringBoot项目日志的说明及使用