CodeGym /Java Blogu /Rastgele /Köprü Tasarım Deseni
John Squirrels
Seviye
San Francisco

Köprü Tasarım Deseni

grupta yayınlandı
MERHABA! Şimdi kapsamlı ve çok önemli, yararlı bir konuyu incelemeye devam ediyoruz: tasarım kalıpları. Bugün köprü modelinden bahsedelim. Diğer kalıplar gibi, köprü kalıbı da bir geliştiricinin yazılım mimarisini tasarlarken karşılaştığı tipik sorunları çözmeye yarar. Bugün bu kalıbın özelliklerini inceleyelim ve nasıl kullanılacağını öğrenelim.

Köprü modeli nedir?

Köprü deseni yapısal bir tasarım desenidir. Diğer bir deyişle, asıl işi, sınıflardan ve nesnelerden tam teşekküllü bir yapı oluşturmaktır. Bir köprü bunu, bir veya daha fazla sınıfı ayrı hiyerarşilere bölerek yapar: soyutlama ve uygulama . Bir hiyerarşideki işlevsellik değişikliği, diğerinde bir değişiklik gerektirmez. Hepsi iyi ve güzel, ancak bu tanım çok geniş ve en önemli soruyu yanıtlamıyor: "Köprü modeli nedir?" Pratik uygulamasını anlamanızın daha kolay olacağını düşünüyorum. O halde hemen köprü paterni için klasik bir senaryo oluşturalım. ShapeGenel bir geometrik şekli temsil eden soyut bir sınıfımız var :
  • Shape.java

    
    public abstract class Shape {
       public abstract void draw();
    }
    

    Üçgen ve dikdörtgen gibi şekiller eklemeye karar verdiğimizde, onların sınıfı devralmasını sağlayacağız Shape:

  • Dikdörtgen.java:

    
    public class Rectangle extends Shape {
       @Override
       public void draw() {
           System.out.println("Drawing rectangle");
       }
    }
    
  • Üçgen.java:

    
    public class Triangle extends Shape {
       @Override
       public void draw() {
           System.out.println("Drawing triangle");
       }
    }
    
Renk kavramını tanıttığımız ana kadar her şey basit görünüyor. Yani her şeklin kendi rengi olacak ve yöntemin işlevselliği draw()bu renge bağlı olacaktır. Yöntemin farklı uygulamalarına sahip olmak için draw(), her şekil-renk kombinasyonu için bir sınıf oluşturmamız gerekir. Üç rengimiz varsa, altı sınıfa ihtiyacımız var: TriangleBlack, TriangleGreen, TriangleRed, ve . Altı ders o kadar büyük bir problem değil. Ancak! Yeni bir şekil veya renk eklememiz gerekirse, sınıf sayısı katlanarak artar. Bu durumdan nasıl çıkılır? Rengi bir alanda depolamak ve koşullu ifadeleri kullanarak tüm seçenekleri sıralamak en iyi çözüm değildir. İyi bir çözüm, rengi ayrı bir arayüze taşımaktır.RectangleBlackRectangleGreenRectangleRed. ColorSöylendiği anda yapılır: üç uygulamalı bir arayüz oluşturalım : BlackColor, GreenColorve RedColor:
  • Color.java:

    
    public interface Color {
       void fillColor();
    }
    
  • BlackColor.java:

    
    public class BlackColor implements Color {
       @Override
       public void fillColor() {
           System.out.println("Filling in black color");
       }
    }
    
  • GreenColor.java

    
    public class GreenColor implements Color {
       @Override
       public void fillColor() {
           System.out.println("Filling in green color");
       }
    }
    
  • RedColor.java

    
    public class RedColor implements Color {
       @Override
       public void fillColor() {
           System.out.println("Filling in red color");
       }
    }
    

    ColorŞimdi sınıfa bir alan ekliyoruz Shape. Yapıcıdaki değerini alacağız.

  • Shape.java:

    
    public abstract class Shape {
       protected Color color;
      
       public Shape(Color color) {
           this.color = color;
       }
    
       public abstract void draw();
    }
    

    colorDeğişkeni uygulamalarda kullanacağız Shape. Bu, şekillerin artık arayüzün işlevselliğini kullanabileceği anlamına gelir Color.

  • Dikdörtgen.java

    
    public class Rectangle extends Shape {
    
       public Rectangle(Color color) {
           super(color);
       }
    
       @Override
       public void draw() {
           System.out.println("Drawing rectangle");
           color.fillColor();
       }
    }
    
Ta-da! Artık sonsuza kadar farklı renkler ve şekiller oluşturabiliriz ve sınıf sayısı yalnızca doğrusal olarak artacaktır. Alan Color color, iki ayrı sınıf hiyerarşisini birbirine bağlayan bir köprüdür.

Bir köprü nasıl kurulur: soyutlama ve uygulama

Köprü modelini gösteren bir sınıf diyagramına bakalım: Köprü tasarım modeline giriş - 2Burada birbirinin işlevselliğini etkilemeden değiştirilebilen iki bağımsız yapı görebilirsiniz. Bizim durumumuzda:
  • Soyutlama Shapesınıftır
  • RefinedAbstraction, Triangleve Rectanglesınıflarıdır
  • ColorUygulayıcı arabirimdir
  • ConcreteImplementor BlackColor, GreenColorve RedColorsınıflarıdır.
Sınıf Shapebir soyutlamadır - şekillerin çeşitli renklerle doldurulmasını yönetmek için arabirime Color(Uygulayıcı) yetki veren bir mekanizma. Triangleve sınıfları , sınıf Rectangletarafından sağlanan mekanizmayı kullanan somut sınıflardır Shape. BlackColorve GreenColorUygulama RedColorhiyerarşisindeki somut uygulamalardır.

Köprü deseni nerede kullanılır?

Bu modeli kullanmanın en büyük yararı, bir hiyerarşideki işlevsel sınıflarda diğerinin mantığını bozmadan değişiklik yapabilmenizdir. Ayrıca, bu yaklaşım sınıflar arasındaki eşleşmeyi azaltmaya yardımcı olur. Bu kalıbı kullanırken temel gereklilik "talimatları takip et" - hiçbirini göz ardı etmeyin! Bunun için köprü kalıbını mutlaka kullanmanız gereken durumlara bir göz atalım:
  1. İki kavramın kombinasyonlarına (örn. şekiller ve renkler) dayalı varlık sayısını artırmanız gerekiyorsa.

  2. Tek sorumluluk ilkesini karşılamayan büyük bir sınıfı, dar işlevselliğe sahip daha küçük sınıflara bölmek istiyorsanız.

  3. Program çalışırken belirli varlıkların mantığında değişiklik yapmak gerekirse.

  4. Bir uygulamayı sınıfın veya kitaplığın istemcilerinden gizlemek gerekirse.

Bu deseni kullandığınızda, kodunuza ek varlıklar eklediğini her zaman unutmayın — yalnızca bir şeklin ve bir veya iki olası rengin olduğu bir projede kullanmak mantıklı olmayabilir.

Desenin artıları ve eksileri

Diğer modeller gibi, bir köprünün de hem avantajları hem de dezavantajları vardır. Köprü modelinin avantajları:
  1. Kodun ölçeklenebilirliğini artırır — programın başka bir bölümünde bir şeyi bozma korkusu olmadan işlevsellik ekleyebilirsiniz.
  2. Aksi takdirde varlıkların sayısı iki kavramın (örneğin, şekiller ve renkler) kombinasyonlarına dayandığında, alt sınıfların sayısını azaltır.
  3. Soyutlama ve Uygulama olmak üzere iki ayrı hiyerarşi üzerinde ayrı ayrı çalışmayı mümkün kılar. İki farklı geliştirici, birbirlerinin kodlarının ayrıntılarına girmeden değişiklik yapabilir.
  4. Sınıflar arasındaki eşleşmeyi azaltır — iki sınıfın birleştiği tek yer köprüdür (yani alan Color color).
Köprü modelinin dezavantajları:
  1. Bir projenin özel durumuna ve genel yapısına bağlı olarak, programın performansını olumsuz etkileyebilir (örneğin, daha fazla nesneyi başlatmanız gerekiyorsa).
  2. İki sınıf arasında geçiş yapma ihtiyacı nedeniyle kodu daha az okunabilir hale getirir.

Strateji modelinden fark

Köprü modeli genellikle başka bir tasarım modeli olan strateji ile karıştırılır. Her ikisi de kompozisyonu kullanır (örnekte şekiller ve renklerle toplamayı kullanmış olmamıza rağmen, Köprü modeli kompozisyonu da kullanabilir), işi diğer nesnelere devreder. Ama aralarında bir fark var ve bu çok büyük. Strateji modeli davranışsal bir modeldir: tamamen farklı sorunları çözer. Strateji, algoritmaların değiştirilmesine izin verirken, köprü, farklı uygulamalar arasında seçim yapmak için bir soyutlamayı uygulamalardan ayırır. Başka bir deyişle, bir stratejiden farklı olarak, bir köprü tüm varlıklara veya hiyerarşik yapılara uygulanır. Köprü modeli, bir geliştiricinin cephaneliğinde iyi bir silah olabilir. Ana şey, onu kullanmaya değer olduğu durumları belirlemek ve başka bir modelin ne zaman uygun olduğunu anlamaktır.
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION