• 组合模式


    /// 安全式的组合模式
        /// 此方式实现的组合模式把管理子对象的方法声明在树枝构件ComplexGraphics类中
        /// 这样如果叶子节点Line、Circle使用了Add或Remove方法时,就能在编译期间出现错误
        /// 但这种方式虽然解决了透明式组合模式的问题,但是它使得叶子节点和树枝构件具有不一样的接口。
        /// 所以这两种方式实现的组合模式各有优缺点,具体使用哪个,可以根据问题的实际情况而定
        class Client
        {
            static void Main(string[] args)
            {
                ComplexGraphics complexGraphics = new ComplexGraphics("一个复杂图形和两条线段组成的复杂图形");
                complexGraphics.Add(new Line("线段A"));
                ComplexGraphics CompositeCG = new ComplexGraphics("一个圆和一条线组成的复杂图形");
                CompositeCG.Add(new Circle(""));
                CompositeCG.Add(new Circle("线段B"));
                complexGraphics.Add(CompositeCG);
                Line l = new Line("线段C");
                complexGraphics.Add(l);
    
                // 显示复杂图形的画法
                Console.WriteLine("复杂图形的绘制如下:");
                Console.WriteLine("---------------------");
                complexGraphics.Draw();
                Console.WriteLine("复杂图形绘制完成");
                Console.WriteLine("---------------------");
                Console.WriteLine();
    
                // 移除一个组件再显示复杂图形的画法
                complexGraphics.Remove(l);
                Console.WriteLine("移除线段C后,复杂图形的绘制如下:");
                Console.WriteLine("---------------------");
                complexGraphics.Draw();
                Console.WriteLine("复杂图形绘制完成");
                Console.WriteLine("---------------------");
                Console.Read();
            }
        }
    
        /// <summary>
        /// 图形抽象类,
        /// </summary>
        public abstract class Graphics
        {
            public string Name { get; set; }
            public Graphics(string name)
            {
                this.Name = name;
            }
    
            public abstract void Draw();
            // 移除了Add和Remove方法
            // 把管理子对象的方法放到了ComplexGraphics类中进行管理
            // 因为这些方法只在复杂图形中才有意义
        }
    
        /// <summary>
        /// 简单图形类——线
        /// </summary>
        public class Line : Graphics
        {
            public Line(string name)
                : base(name)
            { }
    
            // 重写父类抽象方法
            public override void Draw()
            {
                Console.WriteLine("" + Name);
            }
        }
    
        /// <summary>
        /// 简单图形类——圆
        /// </summary>
        public class Circle : Graphics
        {
            public Circle(string name)
                : base(name)
            { }
    
            // 重写父类抽象方法
            public override void Draw()
            {
                Console.WriteLine("" + Name);
            }
        }
    
        /// <summary>
        /// 复杂图形,由一些简单图形组成,这里假设该复杂图形由一个圆两条线组成的复杂图形
        /// </summary>
        public class ComplexGraphics : Graphics
        {
            private List<Graphics> complexGraphicsList = new List<Graphics>();
            public ComplexGraphics(string name)
                : base(name)
            { }
    
            /// <summary>
            /// 复杂图形的画法
            /// </summary>
            public override void Draw()
            {
                foreach (Graphics g in complexGraphicsList)
                {
                    g.Draw();
                }
            }
    
            public void Add(Graphics g)
            {
                complexGraphicsList.Add(g);
            }
            public void Remove(Graphics g)
            {
                complexGraphicsList.Remove(g);
            }
        }

     

    四、组合模式的使用场景

    在以下情况下应该考虑使用组合模式:

    1. 需要表示一个对象整体或部分的层次结构。
    2. 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
  • 相关阅读:
    Python接口测试学习笔记(五)
    Python接口测试学习笔记(四)
    Python接口测试学习笔记(三)
    Python接口测试学习笔记(二)
    Caused by: java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'.
    Linux虚拟机安装MySQL8.0数据库
    剑指offer题解02-10
    Git使用的常用命令
    使用IDEA整合SSM框架
    IntelliJ IDEA 连接数据库 详细过程
  • 原文地址:https://www.cnblogs.com/gaocong/p/6780302.html
Copyright © 2020-2023  润新知