Көпір үлгісі дегеніміз не?
Көпір үлгісі құрылымдық дизайн үлгісі болып табылады. Яғни, оның негізгі міндеті класстар мен an objectілердің толық құрылымын құру болып табылады. Bridge бұл мәселені бір немесе бірнеше сыныптарды жеке иерархияларға бөлу арқылы шешеді - абстракциялау және жүзеге асыру . Бір иерархиядағы функционалдылықтың өзгеруі басқасының өзгеруіне әкелмейді. Барлығы түсінікті сияқты, бірақ іс жүзінде бұл анықтама өте кең естіледі және «Көпір үлгісі дегеніміз не?» деген негізгі сұраққа жауап бермейді. Менің ойымша, бұл сізге іс жүзінде анықтау оңайырақ болады. Бірден Bridge үлгісіне классикалық мысалды үлгілейік.Shape
Бізде әдетте геометриялық фигураны сипаттайтын дерексіз класс бар :
-
Shape.java
public abstract class Shape { public abstract void draw(); }
Біз үшбұрыш пен тіктөртбұрыш кескіндерін қосуды шешкенде, біз сыныптан мұраға аламыз
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()
. Әдістің әртүрлі іске асырылуы үшін draw()
түске сәйкес келетін әрбір пішін үшін класс жасау керек. Егер үш түс болса, онда алты класс бар: TriangleBlack
, TriangleGreen
, TriangleRed
, 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
Енді классқа тип өрісін қосамызShape
– оның мәнін конструкторда аламыз. -
Shape.java:
public abstract class Shape { protected Color color; public Shape(Color color) { this.color = color; } public abstract void draw(); }
Біз айнымалы мәнді іске асыруда
color
қолданамызShape
. Бұл пішіндер енді интерфейстің функционалдығын пайдалана алады дегенді білдіреді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(); } }
Color color
екі бөлек класс иерархиясын өзара байланыстыратын көпір болып табылады.
Көпір құрылғысы: абстракция және іске асыру дегеніміз не
Көпір үлгісін сипаттайтын класс диаграммасын қарастырайық: Мұнда сіз бір-бірінің функционалдылығына әсер етпей өзгертуге болатын екі тәуелсіз құрылымды көре аласыз. Біздің жағдайда бұл:- Абстракция - класс
Shape
; - RefinedAbstraction - сыныптар
Triangle
,Rectangle
; - Орындаушы - интерфейс
Color
; - ConcreteImplementor - сыныптар
BlackColor
,GreenColor
жәнеRedColor
.
Shape
Абстракцияны білдіреді - әртүрлі түстердегі кескіндерді бояуды басқару механизмі, ол интерфейске Implementation өкілеттігін береді Color
. Сыныптар Triangle
- бұл Rectangle
сынып ұсынатын механизмді пайдаланатын нақты an objectілер Shape
. BlackColor
, GreenColor
және RedColor
- Іске асыру бөліміндегі нақты іске асырулар. Оларды көбінесе платформа деп атайды.
Көпір үлгісі қайда қолданылады?
Бұл үлгіні пайдаланудың үлкен артықшылығы мынада: бір фorалдағы сыныптардың функционалдығын басқасының логикасын бұзбай өзгертуге болады. Бұл тәсіл сонымен қатар бағдарлама сыныптарының байланысын азайтуға көмектеседі. Үлгілерді пайдаланудың негізгі шарты - «нұсқауларды орындау»: оларды еш жерде жаппаңыз! Шындығында, көпірді қандай жағдайларда пайдалану керек екенін анықтайық:-
Нысандардың санын екі бағытта кеңейту қажет болса (геометриялық пішіндер, түстер).
-
Бірыңғай жауапкершілік қағидасына сәйкес келмейтін үлкен сыныпты тар профильді функционалдығы бар кішірек сыныптарға бөлгіңіз келсе.
-
Бағдарлама жұмыс істеп тұрған кезде белгілі бір нысандардың жұмыс істеу логикасына өзгертулер енгізу қажеттілігі туындаса.
-
Қажет болса, іске асыруды сынып (кітапхана) клиенттерінен жасырыңыз.
Үлгінің оң және теріс жақтары
Басқа үлгілер сияқты, көпірдің де артықшылықтары мен кемшіліктері бар. Көпірдің артықшылықтары:- Кодтың масштабталуын жақсартады - бағдарламаның басқа бөлігінде бірдеңені бұзудан қорықпай функционалдылықты қосуға болады.
- Ішкі сыныптардың санын азайтады - екі бағытта нысандардың санын кеңейту қажет болғанда жұмыс істейді (мысалы, пішіндер саны және түстер саны).
- Абстракция мен іске асырудың екі тәуелсіз тармақтарында бөлек жұмыс істеуге мүмкіндік береді - мұны екі түрлі әзірлеуші бір-бірінің codeының егжей-тегжейлерін зерттемей-ақ жасай алады.
- Класстардың байланысын азайту - екі сыныпты біріктіретін жалғыз орын көпір (өріс
Color color
).
- Нақты жағдайға және тұтастай жобаның құрылымына байланысты бағдарлама өнімділігіне теріс әсер етуі мүмкін (мысалы, егер көбірек an objectілерді инициализациялау қажет болса).
- Сыныптар арасында шарлау қажеттілігіне байланысты codeты оқуды қиындатады.
GO TO FULL VERSION