public IHaveArea ReceiveFigure(IHaveArea figure)
        {
            var decoratedFigure = new ZoomDecorator(figure);

            decoratedFigure.Zoom = this.currentZoom;
            this.figures.Add(decoratedFigure);
            return(decoratedFigure);
        }
示例#2
0
 public ZoomDecorator(IHaveArea innerShape)
 {
     _innerShape = innerShape;
 }
        /// <summary>
        /// функция которая читает команды И отрабатывает каждую из них.
        /// В соответствии с принципом OpenClosed каждая из комманд должна отрабатываться независимо
        /// а здесь нужна фабрика данных отработчиков вместо свича
        /// </summary>
        /// <returns></returns>
        private bool ReceiveCommand()
        {
            Console.WriteLine("Enter command.('S'=enter square, 'R'=rectange,'Z'=zoom all figures,'P'=print arear, 'Q'=stop this!");

            var       newLine = Console.ReadLine().ToLowerInvariant();
            IHaveArea figure  = null;

            switch (newLine)
            {
            // обрабатываем ввод квадрата
            case "s":
                Console.WriteLine("enter size");
                var size = int.Parse(Console.ReadLine());

                var square = new Square(new RectangleAreaEquation());
                square.SideSize = size;

                figure = square;
                break;

            // обрабатываем ввод прямоугольника
            case "r":
                Console.WriteLine("enter X size");
                var xSize = int.Parse(Console.ReadLine());
                Console.WriteLine("enter Y size");
                var ySize = int.Parse(Console.ReadLine());

                var rect = new Rectangle(new RectangleAreaEquation());
                rect.Length = xSize;
                rect.Height = ySize;

                figure = rect;
                break;

            // обрабатываем зум
            case "z":
                Console.WriteLine("enter zoom factor");
                var zoom = int.Parse(Console.ReadLine());
                this.zoom.Zoom(zoom);     // >_< never do this boys
                break;

            // выводим текущуб общую площадь
            case "p":
                Console.WriteLine("total consumed area:");
                var totalArea = 0d;
                foreach (var fig in this.figures)
                {
                    totalArea += fig.Area();
                }
                Console.WriteLine(totalArea);
                break;

            // выйти из программы
            case "q":
                return(false);
            }

            // если фигура была сформирована текущей командой - завернуть её в Zoom фичу и добавить в список фигур
            if (figure != null)
            {
                var zoomableFigure = this.zoom.ReceiveFigure(figure);
                figures.Add(zoomableFigure);
            }

            return(true);
        }