JavaRush /Java blogi /Random-UZ /Ko'prik dizayni namunasi

Ko'prik dizayni namunasi

Guruhda nashr etilgan
Salom! Biz keng va juda foydali mavzuni - dizayn naqshlarini tushunishda davom etamiz. Bugun biz Bridge haqida gaplashamiz. Boshqa naqshlar singari, Bridge dasturiy ta'minot arxitekturasini loyihalashda ishlab chiquvchi duch keladigan umumiy muammolarni hal qilish uchun xizmat qiladi. Keling, bugun uning xususiyatlarini o'rganamiz va undan qanday foydalanishni bilib olaylik.

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. ShapeBizda 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");
       }
    }
"Rang" tushunchasini kiritmagunimizcha, hamma narsa oddiy ko'rinadi. Ya'ni, har bir raqam o'z rangiga ega bo'ladi, bu usulning funksionalligi bog'liq bo'ladi 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 : RectangleBlackRectangleGreenRectangleRedColorBlackColorGreenColorRedColor
  • 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");
       }
    }

    ColorEndi sinfga tip maydonini qo'shamiz Shape- 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 colorfoydalanamiz Shape. Bu degani, endi shakllar interfeysning funksionalligidan foydalanishi mumkin 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();
       }
    }
Mana! Endi biz arifmetik progressiyadagi sinflar sonini ko'paytirib, hatto cheksiz bo'lsa ham turli xil ranglar va geometrik shakllarni ishlab chiqarishimiz mumkin. Maydon Color colorikkita 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: Ko'prik dizayni naqshiga kirish - 2Bu 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, GreenColorva RedColor.
Sinf ShapeAbstraktsiyani ifodalaydi - turli xil ranglardagi shakllarni bo'yashni boshqarish mexanizmi, Implementatsiyani interfeysga topshiradi Color. Sinflar sinf tomonidan taklif qilingan mexanizmdan foydalanadigan haqiqiy Triangleob'ektlardir . , va - Amalga oshirish bo'limidagi maxsus ilovalar. Ular ko'pincha platforma deb ataladi. RectangleShapeBlackColorGreenColorRedColor

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:
  1. Agar ob'ektlar sonini ikki yo'nalishda (geometrik shakllar, ranglar) kengaytirish kerak bo'lsa.

  2. Agar Yagona javobgarlik tamoyiliga mos kelmaydigan katta sinfni tor profilli funksionallikka ega kichikroq sinflarga ajratmoqchi boʻlsangiz.

  3. Agar dastur ishlayotgan vaqtda muayyan ob'ektlarning ishlashi mantiqiga o'zgartirishlar kiritish zarurati tug'ilsa.

  4. Agar kerak bo'lsa, dasturni sinf (kutubxona) mijozlaridan yashiring.

Har safar naqsh ishlatganda, u kodga qo'shimcha ob'ektlarni qo'shishini esdan chiqarmasligingiz kerak - uni faqat bitta geometrik shakl va bitta yoki ikkita mumkin bo'lgan rang mavjud bo'lgan loyihada ishlatish mutlaqo mantiqiy emas.

Shaklning ijobiy va salbiy tomonlari

Boshqa naqshlar singari, ko'prikning ham afzalliklari, ham kamchiliklari bor. Ko'prikning afzalliklari:
  1. Kodning miqyoslanishini yaxshilaydi - dasturning boshqa qismida biror narsani buzishdan qo'rqmasdan funksionallikni qo'shishingiz mumkin.
  2. Kichik sinflar sonini kamaytiradi - ob'ektlar sonini ikki yo'nalishda kengaytirish zarur bo'lganda ishlaydi (masalan, shakllar soni va ranglar soni).
  3. 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.
  4. Sinflarning ulanishini kamaytirish - ikkita sinf bog'langan yagona joy ko'prikdir (maydon Color color).
Ko'prikning kamchiliklari:
  1. 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).
  2. Sinflar orasida harakat qilish zarurati tufayli kodni o'qishni qiyinlashtiradi.

Strategiya sxemasidan farqi

Ko'prik naqshini ko'pincha boshqa dizayn namunasi, Strategiya bilan aralashtirib yuborishadi. Ularning ikkalasi ham kompozitsiyadan foydalanadi (shakllar va ranglar misolida biz yig‘ishdan foydalanganmiz, lekin Bridge naqshida kompozitsiya ham ishlatilishi mumkin) ishni boshqa ob’yektlarga topshiradi. Ammo ular orasida farq bor va bu juda katta. Strategiya namunasi xulq-atvor namunasidir: u butunlay boshqa muammolarni hal qiladi. Strategiya algoritmlarni bir-birini almashtirish imkonini beradi, Bridge esa turli xil ilovalar o'rtasida tanlov qilish uchun abstraktsiyani amalga oshirishdan ajratadi. Ya'ni, Bridge, Strategiyadan farqli o'laroq, butun konstruktsiyalar yoki ierarxik tuzilmalar uchun amal qiladi. Ko'prik namunasi ishlab chiquvchining arsenalida yaxshi qurol bo'lishi mumkin; asosiysi, undan foydalanishga arziydigan vaziyatlarni topish yoki boshqa naqshdan foydalanish. Agar siz boshqa shablonlar bilan hali tanish bo'lmasangiz, ushbu materiallarni o'qing:
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION