zoukankan      html  css  js  c++  java
  • CSharp设计模式读书笔记(9):组合模式(学习难度:★★★☆☆,使用频率:★★★★☆)

    组合模式(Composite Pattern):

    组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式。

    角色模式与结构:

    组合模式的关键是定义了一个抽象构件类,它既可以代表叶子,又可以代表容器,而客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。

    示例代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace CSharp.DesignPattern.CompositePattern
    {
        class Program
        {
            static void Main(string[] args)
            {
                Component leaf1;
                Component leaf2;
    
                Component composite1;
                Component composite2;
    
                leaf1 = new Leaf();
                leaf2 = new Leaf();
    
                composite1 = new Composite();
                composite2 = new Composite();
    
                composite2.Add(leaf2);
                composite1.Add(composite2);
                composite1.Add(leaf1);
    
                composite1.Operation();
    
                Console.ReadLine();
            }
        }
    
        // 抽象构件
        abstract class Component
        {
            public abstract void Add(Component c);
            public abstract void Remove(Component c);
            public abstract Component GetChild(int i);
            public abstract void Operation();
        }
    
        // 叶子节点
        class Leaf : Component
        {
            public override void Add(Component c)
            {
                // 异常处理或错误提示
            }
    
            public override void Remove(Component c)
            {
                // 异常处理或错误提示
            }
    
            public override Component GetChild(int i)
            {
                // 异常处理或错误提示
                return null;
            }
    
            public override void Operation() // 直接实现叶子节点的业务方法
            {
                Console.WriteLine("Leaf Operation...");
            }
        }
    
        // 非叶子节点
        class Composite : Component
        {
            private List<Component> list = new List<Component>(); // 体现组合模式的地方
    
            public override void Add(Component c)
            {
                list.Add(c);
            }
    
            public override void Remove(Component c)
            {
                list.Remove(c);
            }
    
            public override Component GetChild(int i)
            {
                return (Component)list[i];
            }
    
            public override void Operation()
            {
                foreach (Object obj in list) // 体现组合模式的地方
                {
                    ((Component)obj).Operation(); // 递归实现业务方法
                }
            }
        }
    }
  • 相关阅读:
    u-boot mkconfig文件分析
    uboot的lds文件分析
    gitlab webhook jenkins 403问题解决方案
    【python】将json串写入文件,并以json格式读取出来
    sqlalchemy 中 desc 的使用
    【mysql】如何通过navicat配置表与表的多对一关系,一对一关系?设计外键的效果
    【mysql】一对一关系的理解,以及Navicat Premium怎么设置字段的唯一性(UNIQUE)?
    【mysql】时间类型-如何根据不同的应用场景,选择合适的时间类型?
    Navicat Premium Mac 12 破解方法-亲测成功
    【linux】cp 批量复制文件
  • 原文地址:https://www.cnblogs.com/thlzhf/p/3993359.html
Copyright © 2011-2022 走看看