Ko'prik namunasi nima?
Ko'prik namunasi konstruktiv dizayn namunasidir. Ya'ni, uning asosiy vazifasi sinflar va ob'ektlarning to'liq strukturasini yaratishdir. Bridge bu muammoni bir yoki bir nechta sinflarni alohida ierarxiyalarga ajratish orqali hal qiladi - abstraktsiya va amalga oshirish . Bir ierarxiyadagi funksionallikning o'zgarishi boshqasining o'zgarishiga olib kelmaydi. Hammasi aniq ko'rinadi, lekin aslida bu ta'rif juda keng ko'rinadi va asosiy savolga javob bermaydi: "Ko'prik namunasi nima?" O'ylaymanki, buni amalda tushunish siz uchun osonroq bo'ladi. Keling, darhol ko'prik naqshining klassik namunasini modellashtiramiz.Shape
Bizda odatda geometrik shaklni tasvirlaydigan mavhum sinf mavjud :
-
Shakl.java
public abstract class Shape { public abstract void draw(); }
Uchburchak va to'rtburchaklar shakllarini qo'shishga qaror qilganimizda, biz sinfdan meros bo'lamiz
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()
. Usulning turli xil ilovalariga ega bo'lish uchun draw()
biz rangga mos keladigan har bir shakl uchun sinf yaratishimiz kerak. Agar uchta rang bo'lsa, unda oltita sinf mavjud : TriangleBlack
, TriangleGreen
, TriangleRed
, va . Oltita sinf unchalik katta ish emas. Lekin! Agar biz yangi shakl yoki rang qo'shishimiz kerak bo'lsa, sinflar soni eksponent ravishda o'sib boradi. Bu vaziyatdan qanday chiqish mumkin? Ranglarni maydonda saqlash va shartlar orqali variantlarni sinab ko'rish eng yaxshi yechim emas. Yaxshi yechim rangni alohida interfeysda ko'rsatishdir . Darhol aytilishicha: keling, interfeys va uning uchta ilovasini yarataylik - , va : 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
Endi sinfga tip maydonini qo'shamizShape
- biz uning qiymatini konstruktorda olamiz. -
Shape.java:
public abstract class Shape { protected Color color; public Shape(Color color) { this.color = color; } public abstract void draw(); }
Amalga oshirishda o'zgaruvchidan
color
foydalanamizShape
. Bu degani, endi shakllar interfeysning funksionalligidan foydalanishi mumkinColor
. -
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
ikkita alohida sinf ierarxiyasini o'zaro bog'laydigan ko'prikdir.
Ko'prik qurilmasi: mavhumlik va amalga oshirish nima
Keling, Bridge naqshini tavsiflovchi sinf diagrammasini ko'rib chiqaylik: Bu erda siz bir-birining funksionalligiga ta'sir qilmasdan o'zgartirilishi mumkin bo'lgan ikkita mustaqil tuzilmani ko'rishingiz mumkin. Bizning holatlarimizda bu:- Abstraksiya - sinf
Shape
; - RefinedAbstraction - sinflar
Triangle
,Rectangle
; - Amalga oshiruvchi - interfeys
Color
; - ConcreteImplementor - sinflar
BlackColor
,GreenColor
vaRedColor
.
Shape
Abstraktsiyani ifodalaydi - turli xil ranglardagi shakllarni bo'yashni boshqarish mexanizmi, Implementatsiyani interfeysga topshiradi Color
. Sinflar sinf tomonidan taklif qilingan mexanizmdan foydalanadigan haqiqiy Triangle
ob'ektlardir . , va - Amalga oshirish bo'limidagi maxsus ilovalar. Ular ko'pincha platforma deb ataladi. Rectangle
Shape
BlackColor
GreenColor
RedColor
Bridge naqsh qayerda ishlatiladi?
Ushbu naqshdan foydalanishning katta afzalligi shundaki, siz boshqasining mantig'ini buzmasdan bir filialdagi sinflarning funksionalligiga o'zgartirishlar kiritishingiz mumkin. Ushbu yondashuv, shuningdek, dastur sinflarining ulanishini kamaytirishga yordam beradi. Naqshlarni ishlatishning asosiy sharti - "ko'rsatmalarga rioya qilish": ularni hech qanday joyga yopishtirmang! Haqiqatan ham, keling, qanday hollarda Bridge-dan albatta foydalanish kerakligini aniqlaylik:-
Agar ob'ektlar sonini ikki yo'nalishda (geometrik shakllar, ranglar) kengaytirish kerak bo'lsa.
-
Agar Yagona javobgarlik tamoyiliga mos kelmaydigan katta sinfni tor profilli funksionallikka ega kichikroq sinflarga ajratmoqchi boʻlsangiz.
-
Agar dastur ishlayotgan vaqtda muayyan ob'ektlarning ishlashi mantiqiga o'zgartirishlar kiritish zarurati tug'ilsa.
-
Agar kerak bo'lsa, dasturni sinf (kutubxona) mijozlaridan yashiring.
Shaklning ijobiy va salbiy tomonlari
Boshqa naqshlar singari, ko'prikning ham afzalliklari, ham kamchiliklari bor. Ko'prikning afzalliklari:- Kodning miqyoslanishini yaxshilaydi - dasturning boshqa qismida biror narsani buzishdan qo'rqmasdan funksionallikni qo'shishingiz mumkin.
- Kichik sinflar sonini kamaytiradi - ob'ektlar sonini ikki yo'nalishda kengaytirish zarur bo'lganda ishlaydi (masalan, shakllar soni va ranglar soni).
- Abstraktsiya va amalga oshirishning ikkita mustaqil bo'limida alohida ishlash imkonini beradi - buni ikki xil ishlab chiquvchi bir-birining kodining tafsilotlarini o'rganmasdan amalga oshirishi mumkin.
- Sinflarning ulanishini kamaytirish - ikkita sinf bog'langan yagona joy ko'prikdir (maydon
Color color
).
- Muayyan vaziyatga va umuman loyihaning tuzilishiga qarab, dastur samaradorligiga salbiy ta'sir ko'rsatishi mumkin (masalan, agar ko'proq ob'ektlarni ishga tushirish kerak bo'lsa).
- Sinflar orasida harakat qilish zarurati tufayli kodni o'qishni qiyinlashtiradi.
GO TO FULL VERSION