Bridge үлгүсү деген эмне?
Bridge үлгүсү структуралык дизайн үлгүсү болуп саналат. Башкача айтканда, анын негизги милдети класстардын жана 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
эки өзүнчө класс иерархиясын бириктирген көпүрө болуп саналат.
Көпүрө түзмөк: абстракция жана ишке ашыруу деген эмне
Келгиле, Bridge үлгүсүн сүрөттөгөн класс диаграммасын карап көрөлү: Бул жерде сиз бири-биринин функционалдуулугуна таасирин тийгизбестен өзгөртө турган эки көз карандысыз структураны көрө аласыз. Биздин учурда бул:- абстракция - класс
Shape
; - RefinedAbstraction - класстар
Triangle
,Rectangle
; - Ишке ашыруучу - интерфейс
Color
; - ConcreteImplementor - класстар
BlackColor
жанаGreenColor
.RedColor
Shape
Абстракцияны билдирет - интерфейске Ишке ашырууну өткөрүп берген ар кандай түстөгү фигуралардын түсүн башкаруу механизми Color
. Класстар бул класс сунуш кылган механизмди колдонгон реалдуу Triangle
an objectтер . , жана - Ишке ашыруу тармагындагы конкреттүү ишке ашыруулар. Алар көбүнчө платформа деп аталат. Rectangle
Shape
BlackColor
GreenColor
RedColor
Bridge үлгүсү кайда колдонулат?
Бул үлгүнү колдонуунун чоң артыкчылыгы - сиз башкасынын логикасын бузбастан бир бутактагы класстардын функционалдуулугуна өзгөртүүлөрдү киргизе аласыз. Бул ыкма ошондой эле программалык класстардын айкалышын азайтууга жардам берет. Үлгүлөрдү колдонуунун негизги шарты - "көрсөтмөлөрдү аткаруу": аларды эч жерге жабышпаңыз! Чынында, келгиле, Bridgeди кандай учурларда сөзсүз колдонушуңуз керектигин аныктап көрөлү:-
эки багытта (геометриялык фигуралар, түстөр) субъекттердин санын кеңейтүү зарыл болсо.
-
Эгерде сиз Бирдиктүү жоопкерчorк принцибине жооп бербеген чоң классты тар профилдик функционалдуулугу бар кичине класстарга бөлгүңүз келсе.
-
Эгерде программа иштеп жаткан учурда айрым an objectилердин иштөө логикасына өзгөртүүлөрдү киргизүү зарылчылыгы келип чыкса.
-
Зарыл болсо, класстын (китепкананын) кардарларынан ишке ашырууну жашырыңыз.
Үлгүнүн жакшы жана жаман жактары
Башка үлгүлөр сыяктуу эле, көпүрөнүн да артыкчылыктары да, кемчorктери да бар. Көпүрөнүн артыкчылыктары:- Коддун масштабдуулугун жакшыртат - программанын башка бөлүгүндө бир нерсени бузуп алуудан коркпостон функцияларды кошо аласыз.
- Чакан класстардын санын азайтат - an objectтердин санын эки багытта кеңейтүү зарыл болгондо иштейт (мисалы, формалардын саны жана түстөрдүн саны).
- Абстракция жана ишке ашыруунун эки көз карандысыз бутактары боюнча өзүнчө иштөөгө мүмкүндүк берет - муну эки башка иштеп чыгуучу бири-биринин codeунун деталдарын изилдебестен жасай алат.
- Класстарды бириктирүүнү азайтуу - эки класстын бириккен жалгыз жери бул көпүрө (талаа
Color color
).
- Конкреттүү кырдаалга жана бүтүндөй долбоордун түзүмүнө жараша программанын өндүрүмдүүлүгүнө терс таасирин тийгизиши мүмкүн (мисалы, көбүрөөк an objectтерди инициализациялоо керек болсо).
- Класстар арасында өтүү зарылдыгынан улам codeдун окулушун кыйындатат.
GO TO FULL VERSION