diff --git a/Trolleybus/AbstractStrategy.java b/Trolleybus/AbstractStrategy.java
new file mode 100644
index 0000000..0d61827
--- /dev/null
+++ b/Trolleybus/AbstractStrategy.java
@@ -0,0 +1,95 @@
+package Trolleybus;
+
+// Класс-стратегия перемещения объекта
+public abstract class AbstractStrategy {
+    private IMoveableObject _moveableObject;
+
+    private Status _state = Status.NotInit;
+
+    private int FieldWidth;
+
+    protected int FieldWidth() {
+        return FieldWidth;
+    }
+
+    private int FieldHeight;
+
+    protected int FieldHeight() {
+        return FieldHeight;
+    }
+
+    public Status GetStatus() {
+        return _state;
+    }
+
+    public void SetData(IMoveableObject moveableObject, int width, int height) {
+        if (moveableObject == null) {
+            _state = Status.NotInit;
+            return;
+        }
+
+        _state = Status.InProgress;
+        _moveableObject = moveableObject;
+        FieldWidth = width;
+        FieldHeight = height;
+    }
+
+    public void MakeStep() {
+        if (_state != Status.InProgress) {
+            return;
+        }
+
+        if (IsTargetDestination()) {
+            _state = Status.Finish;
+            return;
+        }
+        MoveToTarget();
+    }
+
+    protected boolean MoveLeft() {
+        return MoveTo(DirectionType.Left);
+    }
+
+    protected boolean MoveRight() {
+        return MoveTo(DirectionType.Right);
+    }
+
+    protected boolean MoveUp() {
+        return MoveTo(DirectionType.Up);
+    }
+
+    protected boolean MoveDown() {
+        return MoveTo(DirectionType.Down);
+    }
+
+    protected ObjectParameters GetObjectParameters(){
+        if (_moveableObject != null) {
+            return _moveableObject.GetObjectPosition();
+        }
+        else {
+            return null;
+        }
+    }
+
+    protected Integer GetStep() {
+        if (_state != Status.InProgress) {
+            return null;
+        }
+        return _moveableObject.GetStep();
+    }
+
+    protected abstract void MoveToTarget();
+
+    protected abstract boolean IsTargetDestination();
+
+    private boolean MoveTo(DirectionType directionType) {
+        if (_state != Status.InProgress) {
+            return false;
+        }
+        if (_moveableObject.CheckCanMove(directionType)) {
+            _moveableObject.MoveObject(directionType);
+            return true;
+        }
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/Trolleybus/DrawingBus.java b/Trolleybus/DrawingBus.java
new file mode 100644
index 0000000..b2fcf7c
--- /dev/null
+++ b/Trolleybus/DrawingBus.java
@@ -0,0 +1,176 @@
+package Trolleybus;
+
+import java.awt.*;
+import java.util.Random;
+
+public class DrawingBus {
+    public EntityBus EntityBus;
+    public EntityBus getEntityBus() {return EntityBus;}
+    private void setEntityBus(EntityBus entityBus) {EntityBus = entityBus;}
+    public IDrawingDoors Doors;
+    // Ширина окна
+    private int _pictureWidth;
+    // Высота окна
+    private int _pictureHeight;
+    // Левая координата прорисовки автобуса
+    protected int _startPosX;
+    // Верхняя координата прорисовки автобуса
+    protected int _startPosY;
+    // Ширина прорисовки автобуса
+    protected int _busWidth = 150;
+    // Высота прорисовки автобуса
+    protected int _busHeight = 95;
+
+    public int GetPosX() {
+        return _startPosX;
+    }
+
+    public int GetPosY() {
+        return _startPosY;
+    }
+
+    public int GetWidth() {
+        return _busWidth;
+    }
+
+    public int GetHeight() {
+        return _busHeight;
+    }
+
+    public DrawingBus(int speed, double weight, Color bodyColor, int width, int height) {
+        if (width < _busWidth || height < _busHeight) {
+            return;
+        }
+        _startPosX = 0;
+        _startPosY = 0;
+
+        _pictureWidth = width;
+        _pictureHeight = height;
+        EntityBus = new EntityBus(speed, weight, bodyColor);
+        Random random = new Random();
+
+        //Форма дверей
+        int shape = random.nextInt(1,4);
+        switch (shape) {
+            case 1:
+                Doors = new DrawingDoors();
+                break;
+            case 2:
+                Doors = new DrawingOvalDoors();
+                break;
+            case 3:
+                Doors = new DrawingTriangleDoors();
+                break;
+        }
+        //Количество дверей
+        Doors.SetCntOfDoors(random.nextInt(3, 6));
+    }
+    protected DrawingBus(int speed, double weight, Color bodyColor, int width, int height, int busWidth, int busHeight) {
+        if (width <= _busWidth || height <= _busHeight) {
+            return;
+        }
+
+        _startPosX = 0;
+        _startPosY = 0;
+        _pictureWidth = width;
+        _pictureHeight = height;
+        _busWidth = busWidth;
+        _busHeight = busHeight;
+        EntityBus = new EntityBus(speed, weight, bodyColor);
+        Random random = new Random();
+
+        //Форма дверей
+        int shape = random.nextInt(1,4);
+        switch (shape) {
+            case 1:
+                Doors = new DrawingDoors();
+                break;
+            case 2:
+                Doors = new DrawingOvalDoors();
+                break;
+            case 3:
+                Doors = new DrawingTriangleDoors();
+                break;
+        }
+        //Количество дверей
+        Doors.SetCntOfDoors(random.nextInt(3, 6));
+    }
+
+    public void SetPosition(int x, int y){
+        _startPosX = Math.min(Math.max(x, 0), _pictureWidth - _busWidth);
+        _startPosY = Math.min(Math.max(y, 0), _pictureHeight - _busHeight);
+    }
+    public boolean CanMove(DirectionType direction)
+    {
+        if (EntityBus == null)
+            return false;
+        boolean can = false;
+        switch (direction)
+        {
+            case Left:
+                can = _startPosX - EntityBus.Step >= 0;
+                break;
+            case Right:
+                can = _startPosX + EntityBus.Step + _busWidth < _pictureWidth;
+                break;
+            case Down:
+                can = _startPosY + EntityBus.Step + _busHeight < _pictureHeight;
+                break;
+            case Up:
+                can = _startPosY - EntityBus.Step >= 0;
+                break;
+        };
+        return can;
+    }
+
+    public void MoveTransport(DirectionType direction){
+        if (!CanMove(direction) || EntityBus == null) {
+            return;
+        }
+        switch (direction)
+        {
+            case Left:
+                if (_startPosX - EntityBus.Step >= 0) {
+                    _startPosX -= (int) EntityBus.Step;
+                }
+                break;
+            case Up:
+                if (_startPosY - EntityBus.Step >= 0) {
+                    _startPosY -= (int) EntityBus.Step;
+                }
+                break;
+            case Right:
+                if (_startPosX + EntityBus.Step + _busWidth <=  _pictureWidth) {
+                    _startPosX += (int) EntityBus.Step;
+                }
+                break;
+            case Down:
+                if (_startPosY + EntityBus.Step + _busHeight <= _pictureHeight) {
+                    _startPosY += (int) EntityBus.Step;
+                }
+                break;
+        }
+    }
+
+    public void DrawTransport(Graphics g) {
+
+        if (EntityBus == null) {
+            return;
+        }
+        Graphics2D g2d = (Graphics2D)g;
+        //Корпус
+        g2d.setColor(EntityBus.getBodyColor());
+        g2d.drawLine(_startPosX, _startPosY + 30, _startPosX, _startPosY + 80);
+        g2d.drawLine(_startPosX, _startPosY + 80, _startPosX + 20, _startPosY + 80);
+        g2d.drawLine(_startPosX + 45, _startPosY + 80, _startPosX + 105, _startPosY + 80);
+        g2d.drawLine(_startPosX + 130, _startPosY + 80, _startPosX + 150, _startPosY + 80);
+        g2d.drawLine(_startPosX + 150, _startPosY + 80, _startPosX + 150, _startPosY + 30);
+        g2d.drawLine(_startPosX + 150, _startPosY + 30, _startPosX, _startPosY + 30);
+        //Колёса
+        g2d.setColor(Color.BLACK);
+        g2d.drawOval(_startPosX + 20, _startPosY + 70, 25, 25);
+        g2d.drawOval(_startPosX + 105, _startPosY + 70, 25, 25);
+        //Двери
+        Doors.DrawDoors(g2d, EntityBus.getBodyColor(), _startPosX, _startPosY);
+    }
+}
\ No newline at end of file
diff --git a/Trolleybus/DrawingDoors.java b/Trolleybus/DrawingDoors.java
index c9635c2..8fa21cb 100644
--- a/Trolleybus/DrawingDoors.java
+++ b/Trolleybus/DrawingDoors.java
@@ -1,7 +1,7 @@
 package Trolleybus;
 
 import java.awt.*;
-public class DrawingDoors {
+public class DrawingDoors implements IDrawingDoors{
     private CntOfDoors _cntOfDoors;
     public void SetCntOfDoors(int cnt) {
         if (cnt <= 3) {
diff --git a/Trolleybus/DrawingObjectBus.java b/Trolleybus/DrawingObjectBus.java
new file mode 100644
index 0000000..a4202e3
--- /dev/null
+++ b/Trolleybus/DrawingObjectBus.java
@@ -0,0 +1,37 @@
+package Trolleybus;
+
+public class DrawingObjectBus implements IMoveableObject {
+    private final DrawingBus _drawingBus;
+
+    public DrawingObjectBus(DrawingBus drawingBus){
+        _drawingBus = drawingBus;
+    }
+
+    public ObjectParameters GetObjectPosition(){
+        if (_drawingBus == null || _drawingBus.EntityBus == null) {
+            return null;
+        }
+        return new ObjectParameters(_drawingBus.GetPosX(), _drawingBus.GetPosY(), _drawingBus.GetWidth(), _drawingBus.GetHeight());
+    }
+
+    public int GetStep(){
+        if (_drawingBus.EntityBus == null) {
+            return 0;
+        }
+        return (int)_drawingBus.EntityBus.Step;
+    }
+
+    public boolean CheckCanMove(DirectionType direction){
+        if (_drawingBus == null) {
+            return false;
+        }
+        return _drawingBus.CanMove(direction);
+    }
+
+    public void MoveObject(DirectionType direction){
+        if (_drawingBus == null) {
+            return;
+        }
+        _drawingBus.MoveTransport(direction);
+    }
+}
\ No newline at end of file
diff --git a/Trolleybus/DrawingOvalDoors.java b/Trolleybus/DrawingOvalDoors.java
new file mode 100644
index 0000000..b49924e
--- /dev/null
+++ b/Trolleybus/DrawingOvalDoors.java
@@ -0,0 +1,59 @@
+package Trolleybus;
+
+import java.awt.*;
+
+public class DrawingOvalDoors implements IDrawingDoors {
+    private CntOfDoors _cntOfDoors;
+    public void SetCntOfDoors(int cnt) {
+        if (cnt <= 3) {
+            _cntOfDoors = CntOfDoors.Three;
+        }
+        if (cnt == 4) {
+            _cntOfDoors = CntOfDoors.Four;
+        }
+        if (cnt >= 5) {
+            _cntOfDoors = CntOfDoors.Five;
+        }
+    }
+    public void DrawDoors(Graphics2D g, Color BodyColor, int _startPosX, int _startPosY) {
+        switch (_cntOfDoors)
+        {
+            case Three:
+                g.setColor(BodyColor);
+                g.drawArc(_startPosX + 2, _startPosY + 50, 16, 60, 0, 180);
+                g.drawArc(_startPosX + 67, _startPosY + 50, 16, 60, 0, 180);
+                g.drawArc(_startPosX + 132, _startPosY + 50, 16, 60, 0, 180);
+
+                g.setColor(Color.CYAN);
+                g.drawOval(_startPosX + 22, _startPosY + 35, 16, 24);
+                g.drawOval(_startPosX + 47, _startPosY + 35, 16, 24);
+                g.drawOval(_startPosX + 87, _startPosY + 35, 16, 24);
+                g.drawOval(_startPosX + 112, _startPosY + 35, 16, 24);
+                break;
+            case Four:
+                g.setColor(BodyColor);
+                g.drawArc(_startPosX + 2, _startPosY + 50, 16, 60, 0, 180);
+                g.drawArc(_startPosX + 48, _startPosY + 50, 16, 60, 0, 180);
+                g.drawArc(_startPosX + 86, _startPosY + 50, 16, 60, 0, 180);
+                g.drawArc(_startPosX + 132, _startPosY + 50, 16, 60, 0, 180);
+
+                g.setColor(Color.CYAN);
+                g.drawOval(_startPosX + 25, _startPosY + 35, 16, 24);
+                g.drawOval(_startPosX + 67, _startPosY + 35, 16, 24);
+                g.drawOval(_startPosX + 109, _startPosY + 35, 16, 24);
+                break;
+            case Five:
+                g.setColor(BodyColor);
+                g.drawArc(_startPosX + 2, _startPosY + 50, 16, 60, 0, 180);
+                g.drawArc(_startPosX + 48, _startPosY + 50, 16, 60, 0, 180);
+                g.drawArc(_startPosX + 67, _startPosY + 50, 16, 60, 0, 180);
+                g.drawArc(_startPosX + 86, _startPosY + 50, 16, 60, 0, 180);
+                g.drawArc(_startPosX + 132, _startPosY + 50, 16, 60, 0, 180);
+
+                g.setColor(Color.CYAN);
+                g.drawOval(_startPosX + 25, _startPosY + 35, 16, 24);
+                g.drawOval(_startPosX + 109, _startPosY + 35, 16, 24);
+                break;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Trolleybus/DrawingTriangleDoors.java b/Trolleybus/DrawingTriangleDoors.java
new file mode 100644
index 0000000..a54952e
--- /dev/null
+++ b/Trolleybus/DrawingTriangleDoors.java
@@ -0,0 +1,83 @@
+package Trolleybus;
+
+import java.awt.*;
+
+public class DrawingTriangleDoors implements IDrawingDoors{
+    private CntOfDoors _cntOfDoors;
+    public void SetCntOfDoors(int cnt) {
+        if (cnt <= 3) {
+            _cntOfDoors = CntOfDoors.Three;
+        }
+        if (cnt == 4) {
+            _cntOfDoors = CntOfDoors.Four;
+        }
+        if (cnt >= 5) {
+            _cntOfDoors = CntOfDoors.Five;
+        }
+    }
+    public void DrawDoors(Graphics2D g, Color BodyColor, int _startPosX, int _startPosY) {
+        switch (_cntOfDoors)
+        {
+            case Three:
+                g.setColor(BodyColor);
+                //Первая дверь
+                g.drawLine(_startPosX + 2, _startPosY + 80, _startPosX + 10, _startPosY + 50);
+                g.drawLine(_startPosX + 10, _startPosY + 50, _startPosX + 18, _startPosY + 80);
+                //Вторая дверь
+                g.drawLine(_startPosX + 67, _startPosY + 80, _startPosX + 75, _startPosY + 50);
+                g.drawLine(_startPosX + 75, _startPosY + 50, _startPosX + 83, _startPosY + 80);
+                //Третья дверь
+                g.drawLine(_startPosX + 132, _startPosY + 80, _startPosX + 140, _startPosY + 50);
+                g.drawLine(_startPosX + 140, _startPosY + 50, _startPosX + 148, _startPosY + 80);
+
+                g.setColor(Color.CYAN);
+                g.drawOval(_startPosX + 22, _startPosY + 35, 16, 24);
+                g.drawOval(_startPosX + 47, _startPosY + 35, 16, 24);
+                g.drawOval(_startPosX + 87, _startPosY + 35, 16, 24);
+                g.drawOval(_startPosX + 112, _startPosY + 35, 16, 24);
+                break;
+            case Four:
+                g.setColor(BodyColor);
+                //Первая дверь
+                g.drawLine(_startPosX + 2, _startPosY + 80, _startPosX + 10, _startPosY + 50);
+                g.drawLine(_startPosX + 10, _startPosY + 50, _startPosX + 18, _startPosY + 80);
+                //Вторая дверь
+                g.drawLine(_startPosX + 48, _startPosY + 80, _startPosX + 56, _startPosY + 50);
+                g.drawLine(_startPosX + 56, _startPosY + 50, _startPosX + 64, _startPosY + 80);
+                //Третья дверь
+                g.drawLine(_startPosX + 86, _startPosY + 80, _startPosX + 94, _startPosY + 50);
+                g.drawLine(_startPosX + 94, _startPosY + 50, _startPosX + 102, _startPosY + 80);
+                //Четвёртая дверь
+                g.drawLine(_startPosX + 132, _startPosY + 80, _startPosX + 140, _startPosY + 50);
+                g.drawLine(_startPosX + 140, _startPosY + 50, _startPosX + 148, _startPosY + 80);
+
+                g.setColor(Color.CYAN);
+                g.drawOval(_startPosX + 25, _startPosY + 35, 16, 24);
+                g.drawOval(_startPosX + 67, _startPosY + 35, 16, 24);
+                g.drawOval(_startPosX + 109, _startPosY + 35, 16, 24);
+                break;
+            case Five:
+                g.setColor(BodyColor);
+                //Первая дверь
+                g.drawLine(_startPosX + 2, _startPosY + 80, _startPosX + 10, _startPosY + 50);
+                g.drawLine(_startPosX + 10, _startPosY + 50, _startPosX + 18, _startPosY + 80);
+                //Вторая дверь
+                g.drawLine(_startPosX + 48, _startPosY + 80, _startPosX + 56, _startPosY + 50);
+                g.drawLine(_startPosX + 56, _startPosY + 50, _startPosX + 64, _startPosY + 80);
+                //Третья дверь
+                g.drawLine(_startPosX + 67, _startPosY + 80, _startPosX + 75, _startPosY + 50);
+                g.drawLine(_startPosX + 75, _startPosY + 50, _startPosX + 83, _startPosY + 80);
+                //Четвёртая дверь
+                g.drawLine(_startPosX + 86, _startPosY + 80, _startPosX + 94, _startPosY + 50);
+                g.drawLine(_startPosX + 94, _startPosY + 50, _startPosX + 102, _startPosY + 80);
+                //Пятая дверь
+                g.drawLine(_startPosX + 132, _startPosY + 80, _startPosX + 140, _startPosY + 50);
+                g.drawLine(_startPosX + 140, _startPosY + 50, _startPosX + 148, _startPosY + 80);
+
+                g.setColor(Color.CYAN);
+                g.drawOval(_startPosX + 25, _startPosY + 35, 16, 24);
+                g.drawOval(_startPosX + 109, _startPosY + 35, 16, 24);
+                break;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Trolleybus/DrawingTrolleybus.java b/Trolleybus/DrawingTrolleybus.java
index 4582035..5d91d87 100644
--- a/Trolleybus/DrawingTrolleybus.java
+++ b/Trolleybus/DrawingTrolleybus.java
@@ -1,126 +1,36 @@
 package Trolleybus;
 
 import java.awt.*;
-import java.util.Random;
-public class DrawingTrolleybus {
-    // Класс-сущность
-    public EntityTrolleybus EntityTrolleybus;
-    // Замена свойства
-    public EntityTrolleybus getEntityTrolleybus() {return EntityTrolleybus;}
-    private void setEntityTrolleybus(EntityTrolleybus entityTrolleybus) {EntityTrolleybus = entityTrolleybus;}
-    public DrawingDoors Doors;
-    // Ширина окна
-    private int _pictureWidth;
-    // Высота окна
-    private int _pictureHeight;
-    // Левая координата прорисовки троллейбуса
-    private int _startPosX;
-    // Верхняя координата прорисовки троллейбуса
-    private int _startPosY;
-    // Ширина прорисовки троллейбуса
-    private final int _trolleybusWidth = 150;
-    // Высота прорисовки троллейбуса
-    private final int _trolleybusHeight = 95;
-    // Инициализация свойств
-    public boolean Init(int speed, double weight, Color bodyColor, Color additionalColor, boolean horns, boolean batteries, int width, int height)
-    {
-        if (width < _trolleybusWidth || height < _trolleybusHeight)
-        {
-            return false;
-        }
-        _pictureWidth = width;
-        _pictureHeight = height;
-        EntityTrolleybus = new EntityTrolleybus();
-        EntityTrolleybus.Init(speed, weight, bodyColor, additionalColor, horns, batteries);
-        //Кол-во дверей
-        Random random = new Random();
-        Doors = new DrawingDoors();
-        Doors.SetCntOfDoors(random.nextInt(3, 6));
-        return true;
-    }
 
-    // Установка позиции
-    public void SetPosition(int x, int y)
+public class DrawingTrolleybus extends DrawingBus{
+    // Конструктор
+    public DrawingTrolleybus(int speed, double weight, Color bodyColor, Color additionalColor, boolean horns, boolean batteries, int width, int height)
     {
-        if (x > _pictureWidth || y > _pictureHeight) {
-            return;
-        }
-        _startPosX = Math.min(Math.max(x, 0), _pictureWidth - _trolleybusWidth);
-        _startPosY = Math.min(Math.max(y, 0), _pictureHeight - _trolleybusHeight);
-    }
-
-    // Изменение направления перемещения
-    public void MoveTransport(DirectionType directionType)
-    {
-        if (EntityTrolleybus == null)
+        super(speed, weight, bodyColor, width, height, 150, 95);
+        if (EntityBus != null)
         {
-            return;
-        }
-
-        switch (directionType)
-        {
-            //влево
-            case Left:
-                if (_startPosX - EntityTrolleybus.Step > 0)
-                {
-                    _startPosX -= (int)EntityTrolleybus.Step;
-                }
-                break;
-            //вверх
-            case Up:
-                if (_startPosY - EntityTrolleybus.Step > 0)
-                {
-                    _startPosY -= (int)EntityTrolleybus.Step;
-                }
-                break;
-            // вправо
-            case Right:
-                if (_startPosX + _trolleybusWidth + EntityTrolleybus.Step < _pictureWidth)
-                {
-                    _startPosX += (int)EntityTrolleybus.Step;
-                }
-                break;
-            // вниз
-            case Down:
-                if (_startPosY + _trolleybusHeight + EntityTrolleybus.Step < _pictureHeight)
-                {
-                    _startPosY += (int)EntityTrolleybus.Step;
-                }
-                break;
+            EntityBus = new EntityTrolleybus(speed, weight, bodyColor, additionalColor, horns, batteries);
         }
     }
     // Прорисовка объекта
+    @Override
     public void DrawTransport(Graphics g)
     {
-        if (EntityTrolleybus == null)
+        if (!(EntityBus instanceof EntityTrolleybus trolleybus))
         {
             return;
         }
+        super.DrawTransport(g);
         Graphics2D g2d = (Graphics2D)g;
-        //РИСОВАНИЕ САМОГО ТРРОЛЛЕЙБУСА
-        //Корпус
-        g2d.setColor(EntityTrolleybus.getBodyColor());
-        g2d.drawLine(_startPosX, _startPosY + 30, _startPosX, _startPosY + 80);
-        g2d.drawLine(_startPosX, _startPosY + 80, _startPosX + 20, _startPosY + 80);
-        g2d.drawLine(_startPosX + 45, _startPosY + 80, _startPosX + 105, _startPosY + 80);
-        g2d.drawLine(_startPosX + 130, _startPosY + 80, _startPosX + 150, _startPosY + 80);
-        g2d.drawLine(_startPosX + 150, _startPosY + 80, _startPosX + 150, _startPosY + 30);
-        g2d.drawLine(_startPosX + 150, _startPosY + 30, _startPosX, _startPosY + 30);
-        //Колёса
-        g2d.setColor(Color.BLACK);
-        g2d.drawOval(_startPosX + 20, _startPosY + 70, 25, 25);
-        g2d.drawOval(_startPosX + 105, _startPosY + 70, 25, 25);
-        //Двери
-        Doors.DrawDoors(g2d, EntityTrolleybus.getBodyColor(), _startPosX, _startPosY);
         //Опциональные "рога"
-        g2d.setColor(EntityTrolleybus.getAdditionalColor());
-        if (EntityTrolleybus.Horns)
+        g2d.setColor(trolleybus.getAdditionalColor());
+        if (trolleybus.Horns)
         {
             g2d.drawLine(_startPosX + 70, _startPosY + 30, _startPosX + 40, _startPosY);
             g2d.drawLine(_startPosX + 70, _startPosY + 30, _startPosX + 60, _startPosY);
         }
         //Опциональный отсек для батареи
-        if (EntityTrolleybus.Batteries)
+        if (trolleybus.Batteries)
         {
             int[] xOfBatteries = {_startPosX + 70, _startPosX + 70, _startPosX + 100, _startPosX + 110};
             int[] yOfBatteries = {_startPosY + 30, _startPosY + 25, _startPosY + 25, _startPosY + 30};
diff --git a/Trolleybus/EntityBus.java b/Trolleybus/EntityBus.java
new file mode 100644
index 0000000..a31e45f
--- /dev/null
+++ b/Trolleybus/EntityBus.java
@@ -0,0 +1,29 @@
+package Trolleybus;
+
+import java.awt.*;
+
+public class EntityBus {
+    public int Speed;
+    public double Weight;
+    public Color BodyColor;
+    public double Step;
+    //геттеры
+    public int getSpeed() {
+        return Speed;
+    }
+    public double getWeight() {
+        return Weight;
+    }
+    public Color getBodyColor() {
+        return BodyColor;
+    }
+    public double getStep() {
+        return Step;
+    }
+    public EntityBus(int speed, double weight, Color bodyColor) {
+        Speed = speed;
+        Weight = weight;
+        Step = (double) Speed * 100 / Weight;
+        BodyColor = bodyColor;
+    }
+}
\ No newline at end of file
diff --git a/Trolleybus/EntityTrolleybus.java b/Trolleybus/EntityTrolleybus.java
index ed6e5de..011b4d9 100644
--- a/Trolleybus/EntityTrolleybus.java
+++ b/Trolleybus/EntityTrolleybus.java
@@ -1,25 +1,7 @@
 package Trolleybus;
 
 import java.awt.*;
-public class EntityTrolleybus {
-    //Скорость
-    public int Speed;
-    // Замена свойства
-    public int getSpeed() {return Speed;}
-    private void setSpeed(int speed) {Speed = speed;}
-
-    // Вес
-    public double Weight;
-    // Замена свойства
-    public double getWeight() {return Weight;}
-    private void setWeight(double weight) {Weight = weight;}
-
-    // Основной цвет
-    public Color BodyColor;
-    // Замена свойства
-    public Color getBodyColor() {return BodyColor;}
-    private void setBodyColor(Color bodyColor) {BodyColor = bodyColor;}
-
+public class EntityTrolleybus extends EntityBus{
     // Дополнительный цвет (для опциональных элементов)
     public Color AdditionalColor;
     // Замена свойства
@@ -38,16 +20,8 @@ public class EntityTrolleybus {
     public boolean getBatteries() {return Batteries;}
     private void setBatteries(boolean batteries) {Batteries = batteries;}
 
-    // Шаг перемещения троллейбуса
-    public double Step;
-
-    // Инициализация полей объекта-класса троллейбуса
-    public void Init(int speed, double weight, Color bodyColor, Color additionalColor, boolean horns, boolean batteries)
-    {
-        Speed = speed;
-        Weight = weight;
-        Step = (double)Speed * 100 / Weight;
-        BodyColor = bodyColor;
+    public EntityTrolleybus(int speed, double weight, Color bodyColor, Color additionalColor, boolean horns ,boolean batteries) {
+        super(speed, weight, bodyColor);
         AdditionalColor = additionalColor;
         Horns = horns;
         Batteries = batteries;
diff --git a/Trolleybus/FormTrolleybus.java b/Trolleybus/FormTrolleybus.java
index e71c892..112ffa1 100644
--- a/Trolleybus/FormTrolleybus.java
+++ b/Trolleybus/FormTrolleybus.java
@@ -7,10 +7,12 @@ import java.awt.event.ActionListener;
 import java.util.Random;
 
 public class FormTrolleybus{
-    private DrawingTrolleybus _drawingTrolleybus;
+    private DrawingBus _drawingBus;
+    private AbstractStrategy _abstractStrategy;
     private JFrame frameTrolleybus;
     private JPanel panelTrolleybus;
-    private JButton buttonCreate, buttonUp, buttonDown, buttonRight, buttonLeft;
+    private JButton buttonCreate, buttonCreateTrolleybus, buttonUp, buttonDown, buttonRight, buttonLeft, buttonStep;
+    private JComboBox comboBoxStrategy;
 
     public FormTrolleybus(){
         //Само окно
@@ -24,8 +26,17 @@ public class FormTrolleybus{
         panelTrolleybus = new JPanel();
         panelTrolleybus.setLayout(null);
 
-        //Кнопка создания
+        //ComboBox
+        String[] strings = {"В центр", "В край"};
+        comboBoxStrategy = new JComboBox(strings);
+        comboBoxStrategy.setBounds(750, 20, 90, 30);
+
+        //Кнопка создания автобуса
         buttonCreate = new JButton("Создать");
+        buttonCreate.setToolTipText("buttonCreate");
+        //Кнопка создания троллейбуса
+        buttonCreateTrolleybus = new JButton("Создать троллейбус");
+        buttonCreateTrolleybus.setToolTipText("buttonCreateTrolleybus");
         //Кнопка вверх
         buttonUp = new JButton();
         buttonUp.setIcon(new ImageIcon("Up.png"));
@@ -42,12 +53,16 @@ public class FormTrolleybus{
         buttonLeft = new JButton();
         buttonLeft.setIcon(new ImageIcon("Left.png"));
         buttonLeft.setToolTipText("buttonLeft");
+        //Кнопка шага
+        buttonStep = new JButton("Шаг");
         //Размеры, позиция кнопок
-        buttonCreate.setBounds(10,400,90,30);
+        buttonCreate.setBounds(10,400,150,30);
+        buttonCreateTrolleybus.setBounds(170, 400, 150, 30);
         buttonUp.setBounds(800,380,30,30);
         buttonDown.setBounds(800,420,30,30);
         buttonLeft.setBounds(760,420,30,30);
         buttonRight.setBounds(840,420,30,30);
+        buttonStep.setBounds(750, 70, 90, 30);
 
         //Добавление листенеров к кнопкам
         buttonCreate.addActionListener(new ActionListener() {
@@ -56,6 +71,12 @@ public class FormTrolleybus{
             }
         });
 
+        buttonCreateTrolleybus.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                ButtonCreate_Click(e);
+            }
+        });
+
         buttonUp.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
                 ButtonMove_Click(buttonUp, e);
@@ -80,40 +101,60 @@ public class FormTrolleybus{
             }
         });
 
+        buttonStep.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                ButtonStep_Click(buttonStep, e);
+            }
+        });
+
         panelTrolleybus.add(buttonCreate);
+        panelTrolleybus.add(buttonCreateTrolleybus);
         panelTrolleybus.add(buttonUp);
         panelTrolleybus.add(buttonDown);
         panelTrolleybus.add(buttonLeft);
         panelTrolleybus.add(buttonRight);
+        panelTrolleybus.add(buttonStep);
+        panelTrolleybus.add(comboBoxStrategy);
         frameTrolleybus.add(panelTrolleybus, BorderLayout.CENTER);
 
         frameTrolleybus.setVisible(true);
     }
     // Метод прорисовки троллейбуса
     private void Draw(){
-        if (_drawingTrolleybus == null) {
+        if (_drawingBus == null) {
             return;
         }
         Graphics g = panelTrolleybus.getGraphics();
         // Очистка перед перерисовкой
         panelTrolleybus.paint(g);
-        _drawingTrolleybus.DrawTransport(g);
+        _drawingBus.DrawTransport(g);
     }
     private void ButtonCreate_Click(ActionEvent e) {
         Random random = new Random();
-        _drawingTrolleybus = new DrawingTrolleybus();
-        _drawingTrolleybus.Init(random.nextInt(100, 300),
-                random.nextInt(1000, 3000),
-                new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)),
-                new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)),
-                random.nextBoolean(),
-                random.nextBoolean(),
-                panelTrolleybus.getWidth(), panelTrolleybus.getHeight());
-        _drawingTrolleybus.SetPosition(random.nextInt(10, 100), random.nextInt(10, 100));
+        JButton info = (JButton)e.getSource();
+        String name = info.getToolTipText();
+        switch (name) {
+            case "buttonCreate":
+                _drawingBus = new DrawingBus(random.nextInt(100, 300),
+                        random.nextInt(1000, 3000),
+                        new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)),
+                        panelTrolleybus.getWidth(), panelTrolleybus.getHeight());
+                break;
+            case "buttonCreateTrolleybus":
+                _drawingBus = new DrawingTrolleybus(random.nextInt(100, 300),
+                        random.nextInt(1000, 3000),
+                        new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)),
+                        new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)),
+                        random.nextBoolean(),
+                        random.nextBoolean(),
+                        panelTrolleybus.getWidth(), panelTrolleybus.getHeight());
+                break;
+        }
+        _drawingBus.SetPosition(random.nextInt(10, 100), random.nextInt(10, 100));
         Draw();
     }
     protected void ButtonMove_Click(Object sender, ActionEvent e) {
-        if (_drawingTrolleybus == null)
+        if (_drawingBus == null)
         {
             return;
         }
@@ -122,18 +163,57 @@ public class FormTrolleybus{
         switch (name)
         {
             case "buttonUp":
-                _drawingTrolleybus.MoveTransport(DirectionType.Up);
+                _drawingBus.MoveTransport(DirectionType.Up);
                 break;
             case "buttonDown":
-                _drawingTrolleybus.MoveTransport(DirectionType.Down);
+                _drawingBus.MoveTransport(DirectionType.Down);
                 break;
             case "buttonLeft":
-                _drawingTrolleybus.MoveTransport(DirectionType.Left);
+                _drawingBus.MoveTransport(DirectionType.Left);
                 break;
             case "buttonRight":
-                _drawingTrolleybus.MoveTransport(DirectionType.Right);
+                _drawingBus.MoveTransport(DirectionType.Right);
                 break;
         }
         Draw();
     }
+    private void ButtonStep_Click(Object sender, ActionEvent e)
+    {
+        if (_drawingBus == null)
+        {
+            return;
+        }
+
+        if (comboBoxStrategy.isEnabled())
+        {
+
+            if (comboBoxStrategy.getSelectedIndex() == 0) {
+                _abstractStrategy = new MoveToCenter();
+            }
+            else if (comboBoxStrategy.getSelectedIndex() == 1) {
+                _abstractStrategy = new MoveToBorder();
+            }
+            else {
+                _abstractStrategy = null;
+            }
+
+            if (_abstractStrategy == null)
+            {
+                return;
+            }
+            _abstractStrategy.SetData(new DrawingObjectBus(_drawingBus), panelTrolleybus.getWidth(), panelTrolleybus.getHeight());
+            comboBoxStrategy.setEnabled(false);
+        }
+        if (_abstractStrategy == null)
+        {
+            return;
+        }
+        _abstractStrategy.MakeStep();
+        Draw();
+        if (_abstractStrategy.GetStatus() == Status.Finish)
+        {
+            comboBoxStrategy.setEnabled(true);
+            _abstractStrategy = null;
+        }
+    }
 }
\ No newline at end of file
diff --git a/Trolleybus/IDrawingDoors.java b/Trolleybus/IDrawingDoors.java
new file mode 100644
index 0000000..3c3d5ff
--- /dev/null
+++ b/Trolleybus/IDrawingDoors.java
@@ -0,0 +1,8 @@
+package Trolleybus;
+
+import java.awt.*;
+
+public interface IDrawingDoors {
+    public void SetCntOfDoors(int cnt);
+    public void DrawDoors(Graphics2D g, Color BodyColor, int _startPosX, int _startPosY);
+}
\ No newline at end of file
diff --git a/Trolleybus/IMoveableObject.java b/Trolleybus/IMoveableObject.java
new file mode 100644
index 0000000..0c06387
--- /dev/null
+++ b/Trolleybus/IMoveableObject.java
@@ -0,0 +1,13 @@
+package Trolleybus;
+
+// Интерфейс для работы с перемещаемым объектом
+public interface IMoveableObject {
+    // Получение координаты X объекта
+    public ObjectParameters GetObjectPosition();
+    // Шаг объекта
+    public int GetStep();
+    // Проверка, можно ли переместиться по нужному направлению
+    boolean CheckCanMove(DirectionType direction);
+    // Изменение направления пермещения объекта
+    void MoveObject(DirectionType direction);
+}
\ No newline at end of file
diff --git a/Trolleybus/MoveToBorder.java b/Trolleybus/MoveToBorder.java
new file mode 100644
index 0000000..07d430e
--- /dev/null
+++ b/Trolleybus/MoveToBorder.java
@@ -0,0 +1,50 @@
+package Trolleybus;
+
+public class MoveToBorder extends AbstractStrategy{
+    @Override
+    protected boolean IsTargetDestination()
+    {
+        var objParams = GetObjectParameters();
+        if (objParams == null)
+        {
+            return false;
+        }
+        return objParams.RightBorder() <= FieldWidth() &&
+                objParams.RightBorder() + GetStep() >= FieldWidth() &&
+                objParams.DownBorder() <= FieldHeight() &&
+                objParams.DownBorder() + GetStep() >= FieldHeight();
+    }
+    @Override
+    protected void MoveToTarget()
+    {
+        var objParams = GetObjectParameters();
+        if (objParams == null)
+        {
+            return;
+        }
+        var diffX = objParams.RightBorder() - FieldWidth();
+        if (Math.abs(diffX) >= GetStep())
+        {
+            if (diffX > 0)
+            {
+                MoveLeft();
+            }
+            else
+            {
+                MoveRight();
+            }
+        }
+        var diffY = objParams.DownBorder() - FieldHeight();
+        if (Math.abs(diffY) >= GetStep())
+        {
+            if (diffY > 0)
+            {
+                MoveUp();
+            }
+            else
+            {
+                MoveDown();
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/Trolleybus/MoveToCenter.java b/Trolleybus/MoveToCenter.java
new file mode 100644
index 0000000..caa14d7
--- /dev/null
+++ b/Trolleybus/MoveToCenter.java
@@ -0,0 +1,50 @@
+package Trolleybus;
+
+public class MoveToCenter extends AbstractStrategy{
+    @Override
+    protected boolean IsTargetDestination() {
+        var objParams = GetObjectParameters();
+
+        if (objParams == null) {
+            return false;
+        }
+        return objParams.ObjectMiddleHorizontal() <= FieldWidth() / 2 &&
+                objParams.ObjectMiddleHorizontal() + GetStep() >= FieldWidth() / 2 &&
+                objParams.ObjectMiddleVertical() <= FieldHeight() / 2 &&
+                objParams.ObjectMiddleVertical() + GetStep() >= FieldHeight() / 2;
+    }
+    @Override
+    protected void MoveToTarget()
+    {
+        var objParams = GetObjectParameters();
+        if (objParams == null)
+        {
+            return;
+        }
+        var diffX = objParams.ObjectMiddleHorizontal() - FieldWidth() / 2;
+        if (Math.abs(diffX) > GetStep())
+        {
+            if (diffX > 0)
+            {
+                MoveLeft();
+            }
+            else
+            {
+                MoveRight();
+            }
+
+        }
+        var diffY = objParams.ObjectMiddleVertical() - FieldHeight() / 2;
+        if (Math.abs(diffY) > GetStep())
+        {
+            if (diffY > 0)
+            {
+                MoveUp();
+            }
+            else
+            {
+                MoveDown();
+            }
+        }
+    }
+}
diff --git a/Trolleybus/ObjectParameters.java b/Trolleybus/ObjectParameters.java
new file mode 100644
index 0000000..f8f86c7
--- /dev/null
+++ b/Trolleybus/ObjectParameters.java
@@ -0,0 +1,46 @@
+package Trolleybus;
+
+// Параметры-координаты объекта
+public class ObjectParameters {
+    private final int _x;
+    private final int _y;
+    private final int _width;
+    private final int _height;
+    public int LeftBorder() {return _x;}
+    public int TopBorder() {return _y;}
+    public int RightBorder() {return _x + _width;}
+    public int DownBorder() {return _y + _height;}
+    public int ObjectMiddleHorizontal() { return _x + _width / 2;}
+    public int ObjectMiddleVertical() {return _y + _height / 2;}
+    public int getLeftBorder() {
+        return _x;
+    }
+
+    public int getTopBorder() {
+        return _y;
+    }
+
+    public int getRightBorder() {
+        return _x + _width;
+    }
+
+    public int getDownBorder() {
+        return _y + _height;
+    }
+
+    public int getObjectMiddleHorizontal() {
+        return _x + _width / 2;
+    }
+
+    public int getObjectMiddleVertical() {
+        return _y + _height / 2;
+    }
+    // Конструктор
+    public ObjectParameters(int x, int y, int width, int height)
+    {
+        _x = x;
+        _y = y;
+        _width = width;
+        _height = height;
+    }
+}
diff --git a/Trolleybus/Status.java b/Trolleybus/Status.java
new file mode 100644
index 0000000..b33459f
--- /dev/null
+++ b/Trolleybus/Status.java
@@ -0,0 +1,7 @@
+package Trolleybus;
+
+public enum Status {
+    NotInit,
+    InProgress,
+    Finish
+}
\ No newline at end of file