• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
思想人生从关注生活开始
博客园    首页    新随笔    联系   管理    订阅  订阅

组合设计模式Composite Pattern-23种常用设计模式快速入门教程

1.组合设计模式定义

组合设计模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树状结构,并且能够像处理独立对象一样处理组合对象。这种模式创建了一个包含自己对象组的类,该类提供了修改相同对象组的方式。 在组合模式中,有两个基本类型的对象:叶子对象和组合对象。组合对象包含了一组叶子对象,因此组合对象可以用来创建一个树形结构。总之,组合模式是一种非常有用的模式,可以使系统更加灵活和可扩展。但是,它也有一些缺点,需要根据具体情况进行权衡和选择。在使用组合模式时,需要考虑到具体的业务需求和系统性能要求。

2.组合设计模式优点:

  • 简化客户端代码
    组合模式可以使客户端代码更简单,因为客户端可以像处理单个对象一样处理组合对象。客户端不需要关心处理的是单个对象还是组合对象,因为它们都实现了相同的接口。
  • 可以更容易地增加新的组合对象和叶子对象
    组合模式使用相同的接口来处理组合对象和叶子对象,因此可以更容易地增加新的组合对象和叶子对象。这使得系统更加灵活和可扩展。
  • 更容易管理树形结构
    组合模式可以更容易地管理树形结构。由于所有的对象都实现了相同的接口,因此可以通过递归方式遍历整个树形结构,并对每个对象进行相同的操作。
  • 可以实现“开闭原则”
    组合模式可以实现“开闭原则”,因为可以通过增加新的组合对象和叶子对象来扩展系统,而不需要修改现有的代码。

3.组合设计模式缺点:

  • 可能会使设计变得过于抽象化,使代码难以理解
    组合模式可能会使设计变得过于抽象化,使代码难以理解。由于所有的对象都实现了相同的接口,因此可能会导致代码变得复杂和难以维护。
  • 在处理组合对象和叶子对象时,可能会导致代码的性能降低
    由于组合模式需要递归遍历整个树形结构,因此在处理组合对象和叶子对象时,可能会导致代码的性能降低。

4.适配器设计模式示例代码

传统设计模式讲解时使用的示例代码,大都采用与读者日常生活接解的业务系统没有多大关联关系。以致大部分读者无法做到学以致用,学完就忘记。本文采用使用日常生活中随处可见的产品相关业务来编写实现代码

首先,创建一个商品接口:

public interface Product {
public void add(Product product);
public void remove(Product product);
public void display();
}

然后创建两个类,一个是叶子对象类(商品类),另一个是组合对象类(商品分类类)

商品类:

public class Item implements Product {
private String name;
public Item(String name) {
this.name = name;
}
public void add(Product product) {
// 暂没有实现
} public void remove(Product product) {
// 暂没有实现
}
public void display() {
System.out.println(name);
}
}

商品分类类:

import java.util.ArrayList;
import java.util.List;
public class Category implements Product {
private String name;
private List<Product> productList = new ArrayList<Product>();
public Category(String name) { t
his.name = name;
}
public void add(Product product) {
productList.add(product);
}
public void remove(Product product) {
productList.remove(product);
}
public void display() {
System.out.println(name);
for (Product product : productList) {
product.display(); }
}
}

在上述示例中,商品分类类实现了Product接口,并且包含了一组商品对象,因此它可以被视为一个组合对象。

posted @ 2023-03-07 16:00  JackYang  阅读(90)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3