JavaRush /Java Blogu /Random-AZ /Körpü dizayn nümunəsi

Körpü dizayn nümunəsi

Qrupda dərc edilmişdir
Salam! Biz geniş və çox faydalı bir mövzunu başa düşməyə davam edirik - dizayn nümunələri. Bu gün Körpü haqqında danışacağıq. Digər nümunələr kimi, Bridge proqram arxitekturasını tərtib edərkən bir tərtibatçının qarşılaşdığı ümumi problemləri həll etməyə xidmət edir. Gəlin bu gün onun xüsusiyyətlərini öyrənək və ondan necə istifadə edəcəyimizi öyrənək.

Körpü nümunəsi nədir?

Körpü nümunəsi struktur dizayn nümunəsidir. Yəni onun əsas vəzifəsi siniflərin və obyektlərin tam strukturunu yaratmaqdır. Bridge bu problemi bir və ya bir neçə sinfi ayrı-ayrı iyerarxiyalara ayırmaqla həll edir - abstraksiyahəyata keçirmə . Bir iyerarxiyada funksionallığın dəyişməsi digərində dəyişikliklərə səbəb olmur. Hər şey aydın görünür, amma əslində bu tərif çox geniş səslənir və əsas suala cavab vermir: "Körpü nümunəsi nədir?" Düşünürəm ki, bunu praktikada başa düşmək sizin üçün daha asan olacaq. Dərhal Körpü nümunəsi üçün klassik nümunəni modelləşdirək. ShapeÜmumiyyətlə həndəsi fiqurları təsvir edən mücərrəd sinifimiz var :
  • Shape.java

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

    Üçbucaq və düzbucaqlı formaları əlavə etmək qərarına gəldikdə, biz sinifdən miras alacağıq Shape:

  • Rectangle.java:

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

    public class Triangle extends Shape {
       @Override
       public void draw() {
           System.out.println("Drawing triangle");
       }
    }
“Rəng” anlayışını təqdim edənə qədər hər şey sadə görünür. Yəni, hər bir rəqəmin öz rəngi olacaq, ondan asılı olacaq metodun funksionallığı draw(). Metodun müxtəlif tətbiqlərinə sahib olmaq üçün draw()rəngə uyğun gələn hər bir forma üçün sinif yaratmalıyıq. Üç rəng varsa, altı sinif var : TriangleBlack, TriangleGreen, TriangleRed, və . Altı sinif o qədər də böyük bir şey deyil. Amma! Əgər yeni forma və ya rəng əlavə etmək lazımdırsa, siniflərin sayı eksponent olaraq artacaq. Bu vəziyyətdən necə çıxmaq olar? Sahədə rənglərin saxlanması və şərtlər vasitəsilə variantları sınamaq ən yaxşı həll yolu deyil. Yaxşı bir həll rəngi ayrıca interfeysdə göstərməkdir . Daha tez deyildi: gəlin interfeysi və onun üç tətbiqini yaradaq - , və : RectangleBlackRectangleGreenRectangleRedColorBlackColorGreenColorRedColor
  • 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İndi sinifə tip sahəsi əlavə edək Shape- onun dəyərini konstruktorda alacağıq.

  • Shape.java:

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

    Dəyişəndən tətbiqlərdə coloristifadə edəcəyik Shape. Bu o deməkdir ki, artıq formalar interfeysin funksionallığından istifadə edə bilər Color.

  • Rectangle.java

    public class Rectangle extends Shape {
    
       public Rectangle(Color color) {
           super(color);
       }
    
       @Override
       public void draw() {
           System.out.println("Drawing rectangle");
           color.fillColor();
       }
    }
Buyurunuz! İndi biz arifmetik irəliləyişdə siniflərin sayını artıraraq, hətta sonsuza qədər müxtəlif rənglər və həndəsi formalar yarada bilərik. Sahə Color coloriki ayrı sinif iyerarxiyasını birləşdirən körpüdür.

Körpü cihazı: abstraksiya və icra nədir

Bridge modelini təsvir edən sinif diaqramına nəzər salaq: Körpünün dizayn nümunəsinə giriş - 2Burada bir-birinin funksionallığına təsir etmədən dəyişdirilə bilən iki müstəqil struktur görə bilərsiniz. Bizim vəziyyətimizdə belədir:
  • Abstraksiya - sinif Shape;
  • RefinedAbstraction - siniflər Triangle, Rectangle;
  • İcraçı - interfeys Color;
  • ConcreteImplementor - siniflər BlackColorGreenColor.RedColor
Sinif ShapeMücərrədliyi təmsil edir - müxtəlif rənglərdə fiqurların rənglənməsinə nəzarət etmək üçün bir mexanizmdir ki, bu da həyata keçirilməsini interfeysə həvalə edir Color. Siniflər sinfin təklif etdiyi mexanizmdən istifadə edən real Triangleobyektlərdir . , və - İcra bölməsində xüsusi tətbiqlər. Onlara tez-tez platforma deyilir. RectangleShapeBlackColorGreenColorRedColor

Körpü nümunəsi harada istifadə olunur?

Bu nümunədən istifadə etməyin böyük üstünlüyü ondan ibarətdir ki, bir filialın məntiqini pozmadan siniflərin funksionallığında dəyişiklik edə bilərsiniz. Bu yanaşma həm də proqram siniflərinin birləşməsini azaltmağa kömək edir. Nümunələrdən istifadə etməyin əsas şərti "təlimatlara əməl etmək"dir: onları heç bir yerə yapışdırmayın! Əslində, Bridge-dən hansı hallarda mütləq istifadə etməli olduğunuzu anlayaq:
  1. Varlıqların sayını iki istiqamətdə genişləndirmək lazımdırsa (həndəsi formalar, rənglər).

  2. Vahid məsuliyyət prinsipinə cavab verməyən böyük bir sinfi dar profilli funksionallığı olan daha kiçik siniflərə bölmək istəyirsinizsə.

  3. Proqram işləyərkən müəyyən obyektlərin işinin məntiqində dəyişiklik etmək mümkün zərurəti yaranarsa.

  4. Lazım gələrsə, tətbiqi sinif (kitabxana) müştərilərindən gizlədin.

Hər dəfə bir naxışdan istifadə edərkən, koda əlavə obyektlər əlavə etdiyini xatırlamaq lazımdır - yalnız bir həndəsi fiqurun və bir və ya iki mümkün rəngin olduğu bir layihədə istifadə etmək tamamilə məntiqli deyil.

Modelin müsbət və mənfi cəhətləri

Digər nümunələr kimi, Körpünün həm üstünlükləri, həm də mənfi cəhətləri var. Körpünün üstünlükləri:
  1. Kodun genişlənməsini yaxşılaşdırır - proqramın başqa bir hissəsində nəyisə pozmaqdan qorxmadan funksionallıq əlavə edə bilərsiniz.
  2. Alt siniflərin sayını azaldır - obyektlərin sayını iki istiqamətdə genişləndirmək lazım olduqda işləyir (məsələn, formaların sayı və rənglərin sayı).
  3. Abstraksiya və Tətbiqin iki müstəqil qolunda ayrıca işləməyi mümkün edir - bu, bir-birinin kodunun təfərrüatlarını araşdırmadan iki fərqli tərtibatçı tərəfindən edilə bilər.
  4. Siniflərin birləşməsinin azaldılması - iki sinfin birləşdirildiyi yeganə yer körpüdür (sahə Color color).
Körpünün çatışmazlıqları:
  1. Xüsusi vəziyyətdən və bütövlükdə layihənin strukturundan asılı olaraq, proqramın məhsuldarlığına mənfi təsir ola bilər (məsələn, daha çox obyektin işə salınması lazımdırsa).
  2. Siniflər arasında keçid ehtiyacına görə kodun oxunuşunu çətinləşdirir.

Strategiya nümunəsindən fərq

Körpü nümunəsi tez-tez başqa bir dizayn nümunəsi olan Strategiya ilə qarışdırılır. Onların hər ikisi işi digər obyektlərə həvalə edərək kompozisiyadan istifadə edir (biz aqreqasiyadan istifadə etdiyimiz forma və rəng nümunəsində, lakin Körpü nümunəsi də kompozisiyadan istifadə edə bilər). Amma onların arasında fərq var və bu, böyükdür. Strategiya nümunəsi davranış nümunəsidir: tamamilə fərqli problemləri həll edir. Strategiya alqoritmlərin dəyişdirilməsinə imkan verir, Bridge isə müxtəlif tətbiqlər arasında seçim etmək üçün abstraksiyanı icradan ayırır. Yəni, Bridge, Strategiyadan fərqli olaraq, bütün konstruksiyalar və ya iyerarxik strukturlara aiddir. Körpü nümunəsi bir tərtibatçının arsenalında yaxşı bir silah ola bilər; əsas odur ki, ondan istifadə etməyə dəyər olan vəziyyətləri tapmaq və ya başqa bir nümunədən istifadə etməkdir. Əgər başqa şablonlarla hələ tanış deyilsinizsə, bu materialları oxuyun:
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION