C# Bridge Pattern Kullanımı - OOP Design Patterns
Soyutlanan nesne ve implementasyonun birbirinden ayrılarak düzenlenmesine olanak sağlar. Nesnenin
değişimi impelementasyonu, implementasyonun değişimi nesneyi etkilemez. Her ikisi bağımsız olarak geliştirilebilir ve türetilen tipleri üzerinden her türlü nesne-implementasyon kombinasyonu gerçeklenebilir.
Tek bir implementasyonun farklı nesneler tarafından da kullanılmasına olanak sağlar.
UML diagramına bakarsak:
Bir örnek üzerinden konuya devam edersek. Örneğin bir oyun aldınız ve oyunu açarken size video modlarını soruyor. OpenGL, Direct3D bu seçeneklerden birini seçtikten sonra oyun artık hep bu seçimle bağlantılı olarak çalışır. Bunu factory class ile de yapabilirdik fakat bridge ile yapmamız bize runtime'da değiştirebilmemizi sağlayacaktır. Video modunu oyunda istediğiniz anda değiştirebilirsiniz öyle düşünün.
Kısacası en önemli kullanım alanları eğer bir nesneyi run-time'da oluşturacaksak ve bu nesne diğer farklı nesneler tarafından kullanılacaksa bu pattern'i kullanmamız akıllıca olacaktır.
RefinedAbstraction nesnemizi bu seçimle implemente ettikten sonra farklı nesneler tarafından da kullanılmasına olanak sağlar. Bu programı en basit anlamda yazdığımızı düşünelim class diagramı şu şekilde olacaktır:
Kodumuzu yazalım şimdi:
değişimi impelementasyonu, implementasyonun değişimi nesneyi etkilemez. Her ikisi bağımsız olarak geliştirilebilir ve türetilen tipleri üzerinden her türlü nesne-implementasyon kombinasyonu gerçeklenebilir.
Tek bir implementasyonun farklı nesneler tarafından da kullanılmasına olanak sağlar.
UML diagramına bakarsak:
Bir örnek üzerinden konuya devam edersek. Örneğin bir oyun aldınız ve oyunu açarken size video modlarını soruyor. OpenGL, Direct3D bu seçeneklerden birini seçtikten sonra oyun artık hep bu seçimle bağlantılı olarak çalışır. Bunu factory class ile de yapabilirdik fakat bridge ile yapmamız bize runtime'da değiştirebilmemizi sağlayacaktır. Video modunu oyunda istediğiniz anda değiştirebilirsiniz öyle düşünün.
Kısacası en önemli kullanım alanları eğer bir nesneyi run-time'da oluşturacaksak ve bu nesne diğer farklı nesneler tarafından kullanılacaksa bu pattern'i kullanmamız akıllıca olacaktır.
RefinedAbstraction nesnemizi bu seçimle implemente ettikten sonra farklı nesneler tarafından da kullanılmasına olanak sağlar. Bu programı en basit anlamda yazdığımızı düşünelim class diagramı şu şekilde olacaktır:
Kodumuzu yazalım şimdi:
/// <summary>
/// Implementor Class
/// </summary>
public interface IVideoMode
{
string GetScreen();
}
/// <summary>
/// ConcreteImplementor for OpenGL
/// </summary>
public class OpenGLMode:IVideoMode
{
const string MODE_NAME = "OpenGL
Mode";
public string GetScreen()
{
return string.Format("Video
started with {0}", MODE_NAME);
}
}
/// <summary>
/// ConcreteImplementor for Direct3D
/// </summary>
public class Direct3DMode:IVideoMode
{
const string MODE_NAME = "Direct3D
Mode";
public string GetScreen()
{
return string.Format("Video
started with {0}", MODE_NAME);
}
}
/// <summary>
/// The 'Abstraction' class
/// </summary>
public class VideoAbstraction
{
protected IVideoMode _videoMode;
//
Property
public IVideoMode VideoMode
{
set { _videoMode = value; }
}
public virtual void ShowScreen()
{
Console.WriteLine(_videoMode.GetScreen());
}
}
public class VideoRefinedAbstraction: VideoAbstraction
{
public override void ShowScreen()
{
Console.WriteLine(_videoMode.GetScreen());
}
}
static void Main(string[] args)
{
VideoAbstraction video = new VideoRefinedAbstraction();
video.VideoMode = new OpenGLMode();
video.ShowScreen();
Console.ReadLine();
}
Çıktı:
Görüldüğü gibi Abstraction classına eklediğimiz VideoMode bir köprü görevi gördü. Bu VideoMode'un tek bir implementasyonu ile farklı nesneler tarafından da kullanılmasına olanak sağladık. Birden fazla RefinedAbstract kullanılabilir programda.
Teşekkürler, güzel paylaşımlarınız için.
YanıtlaSil