Köprü kalıp soyutlamayı
(abstraction) uygulamadan
(implementation) ayırarak ikisinin birbirinden bağımsız çalışmasını sağlar. Bunu yaparken katmanlı yapı
(encapsulation), toplama
(aggregation) ve de kalıtımı kullanarak programın görevlerini birbirlerinden farklı sınıflara aktarırlar.
Kullanıldığı Durumlar;
Köprü tasarım kalıbı, bir modelleme yapılırken oluşan soyut oluşumlar ve bu oluşumlara ait uygulamaları birbirinden ayırır, bu sayede yazılımcı sınıf hiyerarşilerini daha esnek bir hale getirebilir. Sınıf hiyerarşilerinin daha esnek bir hale getirilmesi modellemede bulunan bir üst sınıfın içinde barındırdığı soyut oluşumların bir arayüz sınıfına taşınmasına olanak sağlar. Böylece yazılımcı, alt sınıfların herhangi bir uygulamayı kullanabilmesini sağlar.
Köprü tasarım kalıbının UML diyagramı aşağıdaki şekildedir;
Bu sınıf ve\veya nesneler şu şekilde çalışır:
Soyutlama arayüzünü tanımlar ve uygulamacı tipinde bir referans sağlar.
- Arıtılmış Soyutlama (RefinedAbstraction):
Soyutlama tarafından tanımlanan arayüzü uzatır.
- Uygulamacı (Implementor):
Uygulama sınıfları için arayüz tanımlar. Bu arayüz Abstraction’un tanımladığı arayüze tam olarak karşılık gelmek zorunda değildir, nitekim bu iki arayüz birbirinden oldukça farklıdır.Genel olarak, uygulama arayüzleri sadece ilksel işlemlere olanak sağlarken. Soyutlama arayüzleri bu ilksel işlemlere dayanan ikincil veya daha yüksek dereceli işlemleri gerçekler.
- Somut Uygulamacı (ConcreteImplementor):
Uygulamacının arayüzünü uygular ve somut bir uygulama tanımlar.
Köprü Kalıbı İle İlgili Uygulama
Hazırlanan örnek uygulama öncelikli olarak 'Main' sınıfı içerisinde yapısal köprü tasarım kalıbı için bir başlangıç uygulaması oluşturur. Bir sonraki adımda konsol uygulamasına geçiş yapar. Daha sonra bir uygulamacı oluşturarak bunu çağırır ve bu uygulamacıyı soyutlamadan ayırmak üzere başka bir uygulamacıya çevirir ve kullanıcının gerekli bilgileri girmesini bekler. Bir sonraki adımda bir soyutlama sınıfı oluşturulur ve uygulamacı soyutlama, arıtılmış soyutlama olmak üzere kola ayrılır. Böylece uygulama soyutlamadan ayrılmış olur. Programın sonundaki ekran çıktısında ise tanımlanan somut uygulama görülmektedir.
Bu yapıların anlaşılması için gerçekleştirilen C# uygulaması aşağıda görülmektedir.
using System;
namespace DoFactory.GangOfFour.Bridge.Structural
{
class MainApp
{
static void Main()
{
Abstraction ab = new RefinedAbstraction();
ab.Implementor = new ConcreteImplementorA();
ab.Operation();
ab.Implementor = new ConcreteImplementorB();
ab.Operation();
Console.ReadKey();
}
}
class Abstraction
{
protected Implementor implementor;
public Implementor Implementor
{
set { implementor = value; }
}
public virtual void Operation()
{
implementor.Operation();
}
}
abstract class Implementor
{
public abstract void Operation();
}
class RefinedAbstraction : Abstraction
{
public override void Operation()
{
implementor.Operation();
}
}
class ConcreteImplementorA : Implementor
{
public override void Operation()
{
Console.WriteLine("ConcreteImplementorA Operation");
}
}
class ConcreteImplementorB : Implementor
{
public override void Operation()
{
Console.WriteLine("ConcreteImplementorB Operation");
}
}
}
Bu uygulamanın ekran çıktısı aşağıda bulunmaktadır.