大话设计模式:组合模式

一、什么是组合模式
将对象组合成树状结构以表示整体和部分的层次结构

组合模式使得用户对单个对象和组合对象的使用具有一致性,提供了一种结构,允许我们忽略对象与集合之间的差别。组合模式又分为透明组合模式和安全组合模式,透明组合模式不区分树枝和树叶,安全组合模式抽象基类只保留共有部分,树枝独有的自己实现。

UML图

在这里插入图片描述
Component: 基类,包含添加/移除/显示的基础功能,
Composite:具体实现像是一层一层的嵌套关系
Leaf:分支最末端,只有显示功能

二、适用场景

当对象以整体和部分的层级关系出现,从使用层面不需要区分整体和部分,具备一致性.比如文件夹文件系统,文件夹下面可以有 文件也可以有子文件夹,子文件夹也可以有文件和子文件夹, 但我们对于不同层级的文件夹操作是一致的。比如生活中的购物袋,有大有小,购物袋可以装商品,也可以装购物袋。

三、优缺点

优点
忽略对象与组合的层次关系,可对此进行一致的操作
添加树枝或树叶节点很方便,不会破坏原有层级。

缺点
系统可能过于庞大而复杂
违背接口隔离原则

四、大话中的例子

总公司与分公司的关系,总公司下有各个地区的分公司,还有自己的各级职能部门, 分公司下也有自己的办事处还有自己的职能部门。总公司就像一个树的根,分公司和它的只能部分就是树枝和树叶 ,树枝下面还可以有树枝和树叶。

五、我的例子
using System;
using System.Collections.Generic;

namespace CompsiteMode
{
    class Program
    {
        static void Main(string[] args)
        {
            Bag smallBag1 = new Bag("小袋子1");
            Bag smallBag2 = new Bag("小袋子2");
            Bag normBag = new Bag("中袋子");
            Bag BigBag = new Bag("大袋子");
            Goods apple = new Goods("苹果", 8, 6);
            Goods banana = new Goods("香蕉", 2, 10);
            Goods water = new Goods("纯净水", 3, 1);
            Goods ErGuoTou = new Goods("二锅头", 16, 2);
            Goods reBull = new Goods("红牛", 6, 3);
            smallBag1.Add(apple);
            smallBag2.Add(banana);
            normBag.Add(water);
            normBag.Add(reBull);
            normBag.Add(smallBag1);
            BigBag.Add(ErGuoTou);
            BigBag.Add(smallBag2);
            BigBag.Add(normBag);

            BigBag.Display(1);
            Console.WriteLine("总计:{0}", BigBag.LineOfDuty());
            Console.ReadKey();
        }
    }


    /// <summary>
    /// 抽象物品
    /// </summary>
    abstract class Articles
    {
        protected string name;
        public Articles(string name)
        {
            this.name = name;
        }

        public abstract void Display(int depth);
        public abstract int LineOfDuty();
    }

    /// <summary>
    /// 袋子
    /// </summary>
    class Bag : Articles
    {
        List<Articles> children = new List<Articles>();
        public Bag(string name) : base(name)
        {
        }

        public void Add(Articles bag)
        {
            children.Add(bag);
        }
        public void Remove(Articles bag)
        {
            children.Remove(bag);
        }
        public override void Display(int depth)
        {
            Console.WriteLine(new string('-', depth) + name);
            foreach (var item in children)
            {
                item.Display(depth + 2);
            }
        }

        public override int LineOfDuty()
        {
            int temp = 0;
            foreach (var item in children)
            {
                temp += item.LineOfDuty();
            }

            return temp;

        }


    }

    /// <summary>
    /// 商品
    /// </summary>
    class Goods : Articles
    {
        int price;
        int num;
        public Goods(string name, int price, int num) : base(name)
        {
            this.price = price;
            this.num = num;
        }

        public override void Display(int depth)
        {
            Console.WriteLine(new string('-', depth) + name);
        }

        public override int LineOfDuty()
        {
            Console.WriteLine("{0}-单价:{1},数量:{2},总价:{3}", name, price, num, price * num);
            return price * num;
        }

    }
}

运行结果

在这里插入图片描述
PS:组合模式如果层级很多,那就会显得过于复杂,层级关系混乱。从感觉上看像是一种递归关系的变异。

课程设计报告:总体方案设计说明 一、软件开发环境配置 本系统采用C++作为核心编程语言,结合Qt 5.12.7框架进行图形用户界面开发。数据库管理系统选用MySQL,用于存储用户数据与小精灵信息。集成开发环境为Qt Creator,操作系统平台为Windows 10。 二、窗口界面架构设计 系统界面由多个功能模块构成,各模块职责明确,具体如下: 1. 起始界面模块(Widget) 作为应用程序的入口界面,提供初始导航功能。 2. 身份验证模块(Login) 负责处理用户登录与账户注册流程,实现身份认证机制。 3. 游戏主大厅模块(Lobby) 作为用户登录后的核心交互区域,集成各项功能入口。 4. 资源管理模块(BagWidget) 展示用户持有的全部小精灵资产,提供可视化资源管理界面。 5. 精灵详情模块(SpiritInfo) 呈现选定小精灵的完整属性数据与状态信息。 6. 用户名录模块(UserList) 系统内所有注册用户的基本信息列表展示界面。 7. 个人资料模块(UserInfo) 显示当前用户的详细账户资料与历史数据统计。 8. 服务器精灵选择模块(Choose) 对战准备阶段,从服务器可用精灵池中选取参战单位的专用界面。 9. 玩家精灵选择模块(Choose2) 对战准备阶段,从玩家自有精灵库中筛选参战单位的操作界面。 10. 对战演算模块(FightWidget) 实时模拟精灵对战过程,动态呈现战斗动画与状态变化。 11. 对战结算模块(ResultWidget) 对战结束后,系统生成并展示战斗结果报告与数据统计。 各模块通过统一的事件驱动机制实现数据通信与状态同步,确保系统功能的连贯性与数据一致性。界面布局遵循模块化设计原则,采用响应式视觉方案适配不同显示环境。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值