Java设计模式_(结构型)_组合模式

本文介绍了Java组合模式,它将对象组合成树形结构表示“部分-整体”层次,使用户对单个和组合对象的使用一致。阐述了涉及的角色,如Component、Leaf、Composite,说明了适用场景,并给出连锁超市积分累计的实现示例,最后得出适用组合模式的结论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引用百科

组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 "组合对象" 的含义。
有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

涉及角色
1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。
2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。
适用性
以下情况下适用组合模式:
1.你想表示对象的部分-整体层次结构
2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。


如:有个需求需求给一个连锁超市的用户会员卡积分进行累计计算,连锁超市即除了总店之外还有各地分店,用户在任意一个店面进行支付消费则会把产生的积分应用到所有超市店。

具体实现

相关代码:

1、定义Component 抽象类MarketCommon

//超市会员卡积分抽象类
public abstract class MarketCommon {
    private String name;
    //积分
    private long cardScore;
    
    public void add(MarketCommon m){}
    public void remove(MarketCommon m){}
    public void pay(){}
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public long getCardScore() {
        return cardScore;
    }
    public void setCardScore(long cardScore) {
        this.cardScore = cardScore;
    }
}

2、创建具体实现

public class MarketBranchScore extends MarketCommon {
    public MarketBranchScore(String name) {
        super.setName(name);
    }
    //记录各个分店信息
    private List<MarketCommon> branchList = new ArrayList<MarketCommon>();
    
    public void add(MarketCommon m) {
        branchList.add(m);
    }
 
    public void remove(MarketCommon m) {
        branchList.remove(m);
    }
 
    public void pay() {
        for (MarketCommon card : branchList) {
            System.out.println(card.getName()+"消费累计积分:"+card.getCardScore());
        }
    }
}


3、客户端串接test

public class Client {
 
    private static void pay() {
        // 创建总店(总店也是分店的一种)
        MarketBranchScore leaderMark = new MarketBranchScore("总店");
        // 创建分店
        MarketBranchScore gzMark = new MarketBranchScore("广州分店");
        MarketBranchScore shMark = new MarketBranchScore("上海分店");
        // 消费
        gzMark.setCardScore(100);
        shMark.setCardScore(500);
 
        leaderMark.add(gzMark);
        leaderMark.add(shMark);
        // 刷卡支付时在各分店累计积分
        leaderMark.pay();
    }
 
    public static void main(String[] args) {
        pay();
    }
}

通过以上代码简单实现了组合模式的应用,运行输出
广州分店消费累计积分:100
上海分店消费累计积分:500

这样在累积所有子店面积分的时候,就不需要去关心子店面的个数了,也不用关系是否是叶子节点还是组合节点了,也就是说不管是总店消费,还是分店消费,即:将总店和所有分店组合当作一个整体,都可以正确有效的计算出活动积分。

结论:

“当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式进行实现”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beyondwild

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值