JavaRush /Java блогы /Random-KK /Көпір дизайны үлгісі

Көпір дизайны үлгісі

Топта жарияланған
Сәлеметсіз бе! Біз кең және өте пайдалы тақырыпты - дизайн үлгілерін түсінуді жалғастырамыз. Бүгін біз көпір туралы сөйлесеміз. Басқа үлгілер сияқты, 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екі бөлек класс иерархиясын өзара байланыстыратын көпір болып табылады.

Көпір құрылғысы: абстракция және іске асыру дегеніміз не

Көпір үлгісін сипаттайтын класс диаграммасын қарастырайық: Көпір дизайны үлгісімен таныстыру - 2Мұнда сіз бір-бірінің функционалдылығына әсер етпей өзгертуге болатын екі тәуелсіз құрылымды көре аласыз. Біздің жағдайда бұл:
  • Абстракция - класс Shape;
  • RefinedAbstraction - сыныптар Triangle, Rectangle;
  • Орындаушы - интерфейс Color;
  • ConcreteImplementor - сыныптар BlackColor, GreenColorжәне RedColor.
Класс ShapeАбстракцияны білдіреді - әртүрлі түстердегі кескіндерді бояуды басқару механизмі, ол интерфейске Implementation өкілеттігін береді Color. Сыныптар Triangle- бұл Rectangleсынып ұсынатын механизмді пайдаланатын нақты an objectілер Shape. BlackColor, GreenColorжәне RedColor- Іске асыру бөліміндегі нақты іске асырулар. Оларды көбінесе платформа деп атайды.

Көпір үлгісі қайда қолданылады?

Бұл үлгіні пайдаланудың үлкен артықшылығы мынада: бір фorалдағы сыныптардың функционалдығын басқасының логикасын бұзбай өзгертуге болады. Бұл тәсіл сонымен қатар бағдарлама сыныптарының байланысын азайтуға көмектеседі. Үлгілерді пайдаланудың негізгі шарты - «нұсқауларды орындау»: оларды еш жерде жаппаңыз! Шындығында, көпірді қандай жағдайларда пайдалану керек екенін анықтайық:
  1. Нысандардың санын екі бағытта кеңейту қажет болса (геометриялық пішіндер, түстер).

  2. Бірыңғай жауапкершілік қағидасына сәйкес келмейтін үлкен сыныпты тар профильді функционалдығы бар кішірек сыныптарға бөлгіңіз келсе.

  3. Бағдарлама жұмыс істеп тұрған кезде белгілі бір нысандардың жұмыс істеу логикасына өзгертулер енгізу қажеттілігі туындаса.

  4. Қажет болса, іске асыруды сынып (кітапхана) клиенттерінен жасырыңыз.

Үлгіні әр уақытта пайдаланған кезде, оның codeқа қосымша нысандарды қосатынын есте сақтау керек - оны тек бір геометриялық фигура және бір немесе екі мүмкін түстер бар жобада пайдалану толығымен қисынды емес.

Үлгінің оң және теріс жақтары

Басқа үлгілер сияқты, көпірдің де артықшылықтары мен кемшіліктері бар. Көпірдің артықшылықтары:
  1. Кодтың масштабталуын жақсартады - бағдарламаның басқа бөлігінде бірдеңені бұзудан қорықпай функционалдылықты қосуға болады.
  2. Ішкі сыныптардың санын азайтады - екі бағытта нысандардың санын кеңейту қажет болғанда жұмыс істейді (мысалы, пішіндер саны және түстер саны).
  3. Абстракция мен іске асырудың екі тәуелсіз тармақтарында бөлек жұмыс істеуге мүмкіндік береді - мұны екі түрлі әзірлеуші ​​бір-бірінің codeының егжей-тегжейлерін зерттемей-ақ жасай алады.
  4. Класстардың байланысын азайту - екі сыныпты біріктіретін жалғыз орын көпір (өріс Color color).
Көпірдің кемшіліктері:
  1. Нақты жағдайға және тұтастай жобаның құрылымына байланысты бағдарлама өнімділігіне теріс әсер етуі мүмкін (мысалы, егер көбірек an objectілерді инициализациялау қажет болса).
  2. Сыныптар арасында шарлау қажеттілігіне байланысты codeты оқуды қиындатады.

Стратегия үлгісінен айырмашылығы

Көпір үлгісін басқа дизайн үлгісімен, Стратегиямен жиі шатастырады. Олардың екеуі де жұмысты басқа нысандарға беру арқылы композицияны пайдаланады (пішіндер мен түстер мысалында біз біріктіруді пайдаландық, бірақ Bridge үлгісі композицияны да пайдалана алады). Бірақ олардың арасында айырмашылық бар және ол өте үлкен. Стратегия үлгісі - мінез-құлық үлгісі: ол мүлдем басқа мәселелерді шешеді. Стратегия алгоритмдердің өзара алмасуына мүмкіндік береді, ал Bridge әртүрлі іске асырулар арасында таңдауға мүмкіндік беру үшін абстракцияны іске асырудан бөледі. Яғни, Bridge, Стратегиядан айырмашылығы, тұтас конструкцияларға немесе иерархиялық құрылымдарға қолданылады. Bridge үлгісі әзірлеушінің арсеналында жақсы қару бола алады; бастысы - оны қолдануға болатын жағдайларды табу немесе басқа үлгіні пайдалану. Басқа үлгілермен әлі таныс болмасаңыз, мына материалдарды оқыңыз:
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION