Мост (шаблон проектирования)
Материал из Википедии — свободной энциклопедии
Bridge, Мост - шаблон проектирования используемый в проектировании программного обеспечения, означает «разделять абстракцию и реализацию так, что бы они могли изменятся независимо». Шаблон bridge (от англ. — мост) использует инкапсуляцию, аггрегирование и может использовать наследование для того что бы разделить ответственность между классами.
При частом изменении класса, преимущества объектно-ориентированного подхода становятся очень полезными, позволяя делать изменения в программе обладая минимальными сведениями о реализации программы. Шаблон bridge является полезным там где не только сам класс часто меняется, но и то, что класс делает.
[править] Пример
Когда абстракция и реализация разделены, они могут изменятся независимо. Рассмотрим такую абстракцию как фигура. Существует множество типов фигур, каждая со своими свойствами и методами. Однако есть что-то что объеденяет все фигуры. Например каждая фигура должна уметь рисовать себя, масштабироваться и т. п. В то же время рисование графики может отличаться в зависимости от типа ОС, или графической библиотеки. Фигуры должны иметь возможность рисовать себя в различных графических средах, но реализовывать в каждой фигуре все способы рисования или модифицировать фигуру каждый раз при изменении способа рисования непрактично. В этом случае помогает шаблон bridge позволяя создавать новые классы которые будут реализовывать рисование в различных графических средах. При использовании такого подхода очень легко можно добавлять как новые фигуры, так и способы их рисования.
[править] Пример на C#
using System; /* "Implementor" */ interface DrawingAPI { public void DrawCircle(double x, double y, double radius); } /* "ConcreteImplementor" 1/2 */ class DrawingAPI1 : DrawingAPI { public void DrawCircle(double x, double y, double radius) { System.Console.WriteLine("API1.circle at {0}:{1} radius {2}\n", x, y, radius); } } /* "ConcreteImplementor" 2/2 */ class DrawingAPI2 : DrawingAPI { public void DrawCircle(double x, double y, double radius) { System.Console.WriteLine("API2.circle at {0}:{1} radius {2}\n", x, y, radius); } } /* "Abstraction" */ interface Shape { public void Draw(); // low-level public void ResizeByPercentage(double pct); // high-level } /* "Refined Abstraction" */ class CircleShape : Shape { private double x, y, radius; private DrawingAPI drawingAPI; public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) { this.x = x; this.y = y; this.radius = radius; this.drawingAPI = drawingAPI; } // low-level i.e. Implementation specific public void Draw() { drawingAPI.drawCircle(x, y, radius); } // high-level i.e. Abstraction specific public void ResizeByPercentage(double pct) { radius *= pct; } } /* "Client" */ class BridgePattern { public static void Main(string[] args) { Shape[] shapes = new Shape[2]; shapes[0] = new CircleShape(1, 2, 3, new DrawingAPI1()); shapes[1] = new CircleShape(5, 7, 11, new DrawingAPI2()); foreach (Shape shape in shapes) { shape.ResizeByPercentage(2.5); shape.Draw(); } } }
шаблоны проектирования править |
порождающие шаблоны | шаблоны поведения | структурные шаблоны | шаблоны параллельного программирования |
структурные шаблоны проектирования править |
адаптер | мост | компоновщик | декоратор | фасад | заместитель | приспособленец |