zoukankan      html  css  js  c++  java
  • 10.组合模式(Composite Pattern)

    using System;
    using System.Collections.Generic;
    
    namespace ConsoleApplication8
    {
        class Program
        {
            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();
            public abstract void Add(Graphics g);
            public abstract void Remove(Graphics g);
        }
    
        /// <summary>
        /// 简单图形类——线
        /// </summary>
        public class Line : Graphics
        {
            public Line(string name)
                : base(name)
            { }
    
            // 重写父类抽象方法
            public override void Draw()
            {
                Console.WriteLine("" + Name);
            }
    
            // 因为简单图形在添加或移除其他图形,所以简单图形Add或Remove方法没有任何意义
            // 如果客户端调用了简单图形的Add或Remove方法将会在运行时抛出异常
            // 我们可以在客户端捕获该类移除并处理
            public override void Add(Graphics g)
            {
                throw new Exception("不能向简单图形Line添加其他图形");
            }
            public override void Remove(Graphics g)
            {
                throw new Exception("不能向简单图形Line移除其他图形");
            }
        }
    
        /// <summary>
        /// 简单图形类——圆
        /// </summary>
        public class Circle : Graphics
        {
            public Circle(string name)
                : base(name)
            { }
    
    
            // 重写父类抽象方法
            public override void Draw()
            {
                Console.WriteLine("" + Name);
            }
    
            public override void Add(Graphics g)
            {
                throw new Exception("不能向简单图形Circle添加其他图形");
            }
    
            public override void Remove(Graphics g)
            {
                throw new Exception("不能向简单图形Circle移除其他图形");
            }
        }
    
        /// <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 override void Add(Graphics g)
            {
                complexGraphicsList.Add(g);
            }
    
            public override void Remove(Graphics g)
            {
                complexGraphicsList.Remove(g);
            }
        }
    }
  • 相关阅读:
    6.66 分钟,一文Python爬虫解疑大全教入门!
    十分钟快速入门 Python,看完即会,不用收藏!
    Python3中真真假假True、False、None等含义详解
    Python基础系列讲解——时间模块详解大全之time模块
    超详细Pycharm部署项目视频教程
    Python进阶量化交易专栏场外篇7- 装饰器计算代码时间
    docker 基本命令
    Linux常用命令
    Docker-部署Mysql
    docker 容器内运行vim命令
  • 原文地址:https://www.cnblogs.com/lgxlsm/p/4639027.html
Copyright © 2011-2022 走看看