Намунаи Bridge чист?
Намунаи Bridge як намунаи тарҳрезии сохторӣ мебошад. Яъне вазифаи асосии он сохтани сохтори мукаммали синфхо ва an objectхо мебошад. Bridge ин мушкилотро тавассути ҷудо кардани як ё якчанд синфҳо ба иерархияҳои алоҳида ҳал мекунад - абстраксия ва татбиқ . Тағйир додани функсия дар як иерархия боиси тағйирот дар зинаи дигар намегардад. Ҳама чиз равшан ба назар мерасад, аммо дар асл ин таъриф хеле васеъ садо медиҳад ва ба саволи асосӣ ҷавоб намедиҳад: "Нақли 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
пулест, ки ду иерархияи синфҳои алоҳидаро ба ҳам мепайвандад.
Дастгоҳи пул: абстраксия ва татбиқ чист
Биёед ба диаграммаи синфҳо назар андозем, ки намунаи Bridge-ро тавсиф мекунад: Дар ин ҷо шумо ду сохтори мустақилро мебинед, ки онҳоро бидуни таъсир ба фаъолияти ҳамдигар тағир додан мумкин аст. Дар ҳолати мо ин аст:- Абстраксия - синф
Shape
; - RefinedAbstraction - синфҳо
Triangle
,Rectangle
; - Иҷрокунанда - интерфейс
Color
; - ConcreteImplementor - синфҳо
BlackColor
ваGreenColor
.RedColor
Shape
абстраксияро ифода мекунад - механизми идоракунии рангкунии шаклҳо бо рангҳои гуногун, ки Амалиётро ба интерфейс вогузор мекунад Color
. Синфҳо an objectҳои воқеӣ Triangle
мебошанд Rectangle
, ки механизми пешниҳодкардаи синфро истифода мебаранд Shape
. BlackColor
, GreenColor
ва RedColor
- татбиқи мушаххас дар бахши татбиқ. Онҳоро аксар вақт платформа меноманд.
Намунаи Bridge дар куҷо истифода мешавад?
Бартарии бузурги истифодаи ин намуна дар он аст, ки шумо метавонед ба фаъолияти синфҳо дар як фorал бе вайрон кардани мантиқи дигараш тағирот ворид кунед. Ин равиш инчунин ба коҳиш додани пайвастагии синфҳои барнома мусоидат мекунад. Шарти асосии истифодабарии намунаҳо ин «иҷрои дастурҳо» аст: онҳоро дар ҳеҷ ҷо нагузоред! Воқеан, биёед бифаҳмем, ки дар кадом ҳолатҳо шумо бояд Bridge-ро истифода баред:-
Агар зарур бошад, ки шумораи an objectҳоро дар ду самт (шаклҳои геометрӣ, рангҳо) васеъ кунед.
-
Агар шумо хоҳед, ки синфи калонеро, ки ба принсипи масъулияти ягона ҷавобгӯ нест, ба синфҳои хурдтар бо функсияҳои профor танг тақсим кунед.
-
Агар зарурати ворид кардани тағирот ба мантиқи кори баъзе an objectҳо ҳангоми иҷрои барнома вуҷуд дошта бошад.
-
Агар лозим бошад, татбиқро аз муштариёни синф (китобхона) пинҳон кунед.
Тарафҳои мусбат ва манфии намуна
Мисли дигар намунаҳо, Пул ҳам афзалиятҳо ва ҳам камбудиҳо дорад. Манфиатҳои Bridge:- Миқёспазирии codeро беҳтар мекунад - шумо метавонед бе тарси шикастани чизе дар қисми дигари барнома функсия илова кунед.
- Шумораи зерсинфҳоро кам мекунад - вақте кор мекунад, ки шумораи an objectҳоро дар ду самт васеъ кардан лозим аст (масалан, шумораи шаклҳо ва шумораи рангҳо).
- Имкон медиҳад, ки дар ду шохаи мустақor абстраксия ва амалӣ кор карда шавад - ин корро ду таҳиягари гуногун бидуни омӯхтани ҷузъиёти codeи ҳамдигар анҷом дода метавонанд.
- Коҳиш додани пайвастагии синфҳо - ягона ҷойе, ки ду синф пайваст мешаванд, пул аст (майдон
Color color
).
- Вобаста ба вазъияти мушаххас ва сохтори лоиҳа дар маҷмӯъ, метавонад ба ҳосилнокии барнома таъсири манфӣ дошта бошад (масалан, агар an objectҳои бештар бояд оғоз карда шаванд).
- Хониши codeро аз сабаби зарурати паймоиш байни синфҳо мушкил мекунад.
GO TO FULL VERSION