目录
一、组合模式的定义与类型
- 一、组合模式的定义与类型
- 二、组合模式的适用场景
- 三、组合模式的优点
- 四、组合模式的缺点
- 五、组合模式相关的设计模式
- 六、组合模式示例
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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?