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 - abstraksiya və hə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"); } }
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ə : RectangleBlack
RectangleGreen
RectangleRed
Color
BlackColor
GreenColor
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
İndi sinifə tip sahəsi əlavə edəkShape
- 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ə
color
istifadə edəcəyikShape
. Bu o deməkdir ki, artıq formalar interfeysin funksionallığından istifadə edə bilərColor
. -
Rectangle.java
public class Rectangle extends Shape { public Rectangle(Color color) { super(color); } @Override public void draw() { System.out.println("Drawing rectangle"); color.fillColor(); } }
Color color
iki 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: Burada 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
BlackColor
vəGreenColor
.RedColor
Shape
Mü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 Triangle
obyektlərdir . , və - İcra bölməsində xüsusi tətbiqlər. Onlara tez-tez platforma deyilir. Rectangle
Shape
BlackColor
GreenColor
RedColor
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:-
Varlıqların sayını iki istiqamətdə genişləndirmək lazımdırsa (həndəsi formalar, rənglər).
-
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ə.
-
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.
-
Lazım gələrsə, tətbiqi sinif (kitabxana) müştərilərindən gizlədin.
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:- 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.
- 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ı).
- 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.
- Siniflərin birləşməsinin azaldılması - iki sinfin birləşdirildiyi yeganə yer körpüdür (sahə
Color color
).
- 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).
- Siniflər arasında keçid ehtiyacına görə kodun oxunuşunu çətinləşdirir.
GO TO FULL VERSION