单例模式 Singleton Ambient Context


单例模式:上下文语境

using System;
using System.Collections.Generic;

namespace DesignParttern_Singleton_Context
{

    public class BuildContext:IDisposable
    {
        public int Height;
        private static Stack Stack = new Stack();
        public static BuildContext Current => Stack.Peek();
        static BuildContext()
        {
            Stack.Push(new BuildContext(0));
        }
        public BuildContext(int i)
        {
            Height = i;
            Stack.Push(this);
        }
        public void Dispose()
        {
            if (Stack.Count>1)
            {
                Stack.Pop();
            }
        }
    }
    public class Building
    {
        public  List walls = new List();

        public void Display() 
        {
            walls.ForEach(a => Console.WriteLine(a));
        }
    }
    public class Wall
    {
        public Point Start, End;
        public int Height;
        public Wall(Point start, Point end)
        {
            Start = start;
            End = end;
            Height = BuildContext.Current.Height;
        }
        public override string ToString()
        {
            return $"{nameof(Start)}:{Start},{nameof(End)}:{End},{nameof(Height)}:{Height},";
        }
    }
    public struct Point
    {
        public int X;
        public int Y;

        public Point(int x, int y)
        {
            X = x;
            Y = y;
        }
        public override string ToString()
        {
            return $"x:{X},y:{Y}";
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Building building = new Building();
            using (new BuildContext(3000))
            {
                building.walls.Add(new Wall(new Point(0, 0), new Point(0, 3000)));
                building.walls.Add(new Wall(new Point(0, 0), new Point(4500, 0)));
                using (new BuildContext(3500))
                {
                    building.walls.Add(new Wall(new Point(0, 0), new Point(0, 3000)));
                    building.walls.Add(new Wall(new Point(0, 0), new Point(4000, 0)));
                }
                building.walls.Add(new Wall(new Point(3000, 0), new Point(0, 0)));
                building.walls.Add(new Wall(new Point(0, 4500), new Point(0, 0)));
                using (new BuildContext(5000))
                {
                    building.walls.Add(new Wall(new Point(3000, 4500), new Point(4500, 3000))); 
                }
            } 
            building.Display();
        }
    }
}