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

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

Группада жарыяланган
Салам! Биз кенен жана абдан пайдалуу теманы түшүнүүнү улантабыз - дизайн үлгүлөрү. Бүгүн биз көпүрө жөнүндө сүйлөшөбүз. Башка үлгүлөр сыяктуу эле, Bridge программалык камсыздоонун архитектурасын иштеп чыгууда иштеп чыгуучу туш болгон жалпы көйгөйлөрдү чечүү үчүн кызмат кылат. Бүгүн анын өзгөчөлүктөрүн изилдеп, аны кантип колдонууну билели.

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 үлгүсүн сүрөттөгөн класс диаграммасын карап көрөлү: Көпүрөнүн дизайн үлгүсүнө киришүү - 2Бул жерде сиз бири-биринин функционалдуулугуна таасирин тийгизбестен өзгөртө турган эки көз карандысыз структураны көрө аласыз. Биздин учурда бул:
  • абстракция - класс Shape;
  • RefinedAbstraction - класстар Triangle, Rectangle;
  • Ишке ашыруучу - интерфейс Color;
  • ConcreteImplementor - класстар BlackColorжана GreenColor.RedColor
Класс ShapeАбстракцияны билдирет - интерфейске Ишке ашырууну өткөрүп берген ар кандай түстөгү фигуралардын түсүн башкаруу механизми Color. Класстар бул класс сунуш кылган механизмди колдонгон реалдуу Trianglean objectтер . , жана - Ишке ашыруу тармагындагы конкреттүү ишке ашыруулар. Алар көбүнчө платформа деп аталат. RectangleShapeBlackColorGreenColorRedColor

Bridge үлгүсү кайда колдонулат?

Бул үлгүнү колдонуунун чоң артыкчылыгы - сиз башкасынын логикасын бузбастан бир бутактагы класстардын функционалдуулугуна өзгөртүүлөрдү киргизе аласыз. Бул ыкма ошондой эле программалык класстардын айкалышын азайтууга жардам берет. Үлгүлөрдү колдонуунун негизги шарты - "көрсөтмөлөрдү аткаруу": аларды эч жерге жабышпаңыз! Чынында, келгиле, Bridgeди кандай учурларда сөзсүз колдонушуңуз керектигин аныктап көрөлү:
  1. эки багытта (геометриялык фигуралар, түстөр) субъекттердин санын кеңейтүү зарыл болсо.

  2. Эгерде сиз Бирдиктүү жоопкерчorк принцибине жооп бербеген чоң классты тар профилдик функционалдуулугу бар кичине класстарга бөлгүңүз келсе.

  3. Эгерде программа иштеп жаткан учурда айрым an objectилердин иштөө логикасына өзгөртүүлөрдү киргизүү зарылчылыгы келип чыкса.

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

Үлгүнү ар бир жолу колдонуп жатканда, ал codeго кошумча an objectтерди кошо турганын эстен чыгарбашыңыз керек - бир гана геометриялык фигура жана бир же эки мүмкүн болгон түстөр бар долбоордо аны колдонуу толук логикалуу эмес.

Үлгүнүн жакшы жана жаман жактары

Башка үлгүлөр сыяктуу эле, көпүрөнүн да артыкчылыктары да, кемчorктери да бар. Көпүрөнүн артыкчылыктары:
  1. Коддун масштабдуулугун жакшыртат - программанын башка бөлүгүндө бир нерсени бузуп алуудан коркпостон функцияларды кошо аласыз.
  2. Чакан класстардын санын азайтат - an objectтердин санын эки багытта кеңейтүү зарыл болгондо иштейт (мисалы, формалардын саны жана түстөрдүн саны).
  3. Абстракция жана ишке ашыруунун эки көз карандысыз бутактары боюнча өзүнчө иштөөгө мүмкүндүк берет - муну эки башка иштеп чыгуучу бири-биринин codeунун деталдарын изилдебестен жасай алат.
  4. Класстарды бириктирүүнү азайтуу - эки класстын бириккен жалгыз жери бул көпүрө (талаа Color color).
Көпүрөнүн кемчorктери:
  1. Конкреттүү кырдаалга жана бүтүндөй долбоордун түзүмүнө жараша программанын өндүрүмдүүлүгүнө терс таасирин тийгизиши мүмкүн (мисалы, көбүрөөк an objectтерди инициализациялоо керек болсо).
  2. Класстар арасында өтүү зарылдыгынан улам codeдун окулушун кыйындатат.

Стратегиянын үлгүсүнөн айырмасы

Bridge үлгүсү көп учурда башка дизайн үлгүсү менен чаташтырылып, Стратегия. Экөө тең композицияны колдонушат (формаларда жана түстөрдүн мисалында биз топтоону колдондук, бирок Bridge үлгүсү композицияны да колдоно алат) ишти башка an objectтерге өткөрүп берүү менен. Бирок алардын ортосунда айырма бар жана бул абдан чоң. Стратегия үлгүсү жүрүм-турум үлгүсү болуп саналат: ал такыр башка маселелерди чечет. Стратегия алгоритмдердин бири-бирин алмаштыруусуна мүмкүндүк берет, ал эми Bridge ар кандай ишке ашыруунун ортосунда тандоого мүмкүндүк берүү үчүн абстракцияны ишке ашыруудан бөлөт. Башкача айтканда, Bridge, Стратегиядан айырмаланып, бүтүндөй конструкцияларга же иерархиялык структураларга тиешелүү. Bridge үлгүсү иштеп чыгуучунун арсеналында жакшы курал боло алат; негизгиси, аны колдонууга арзырлык жагдайларды табуу же башка үлгүнү колдонуу. Эгер сиз башка шаблондор менен тааныш эмес болсоңуз, бул материалдарды окуп чыгыңыз:
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION