Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Міст — Bridge

Уривок коду 6.1. Читаємо код і вникаємо

// Система яку будемо адаптовуватиclass OldElectricitySystem{ public string MatchThinSocket() { return "220V"; }}// Широковикористовуваний інтерфейс нової системи (специфікація до квартири)interface INewElectricitySystem{ string MatchWideSocket();}// Ну і власне сама розетка у новій квартиріclass NewElectricitySystem : INewElectricitySystem{ public string MatchWideSocket() { return "220V"; }} // Адаптер назовні виглядає як нові євроразетки, шляхом наслідування прийнятного у // системі інтерфейсуclass Adapter : INewElectricitySystem{ // Але всередині він таки знає, що коїлося в СРСР private readonly OldElectricitySystem _adaptee; public Adapter(OldElectricitySystem adaptee) { _adaptee = adaptee; } // А тут відбувається вся магія - // наш адаптер «перекладає» // функціональність із нового стандарту на старий public string MatchWideSocket() { // Якщо б була різниця в напрузі (не 220V) // то тут ми б помістили трансформатор return _adaptee.MatchThinSocket(); }} class ElectricityConsumer{ // Зарядний пристрій розуміє тільки нову систему public static void ChargeNotebook(INewElectricitySystem electricitySystem) { Console.WriteLine(electricitySystem.MatchWideSocket()); }} public class AdapterDemo{ public static void Run() { // 1) // Ми можемо користуватися новою системою без проблем var newElectricitySystem = new NewElectricitySystem(); ElectricityConsumer.ChargeNotebook(newElectricitySystem); // 2) // Ми повинні адаптуватися до старої системи, використовуючи адаптер var oldElectricitySystem = new OldElectricitySystem(); var adapter = new Adapter(oldElectricitySystem); ElectricityConsumer.ChargeNotebook(adapter); }}

Попрошу ще раз повернутися до коду і переконатися, що ви прочитали усі коментарі, а взаємодія між класами була зрозуміла. Для кращого засвоєння, візьміть ручку і на будь-якому «огризку» паперу намалюйте UML до цієї реалізації патерну Адаптер, а потім узагальніть.

Насправді в реалізації не є обов’язковою композиція adaptee. Також наш клас Adapter міг би одночасно реалізовувати два інтерфейси — нової і старої системи. А зробивши два конструктори (а чому б і ні?), ми б могли одного разу створити його на базі нової, а іншого — на базі старої системи. Це б дозволило використовувати його в обидва боки. Натиснувши собі якусь кнопку, ваш адаптер перетворюється «шиворіт-на-виворіт».

Додати до моєї бази знань Патерни

Уявімо, що ви володієте будівельною компанією, яка будує дачні будинки і житлові масиви. Зазвичай будівлі є двох типів - або з цегли, або з бетонних плит. Оскільки ви бос, то ви вирішили поділити всіх ваших робітників на команди, які будуть вміти робити одні і ті ж операції: BuildFoundation, BuildRoom, BuildRoof. Так як будівлі є двох типів, то вам прийдеться тримати два типи різних бригад.

Одного разу виявилося, що будівлі можуть бути побудовані із бетонних і цегляних стін одночасно. Так як у кожній із бригад вміли працювати тільки із одним типом стін, ви були змушені переміщати цілі бригади із одного закутка міста в інший. Прямо таки переселення народів. Працівники починають жалітися і пропонують вирішення проблеми. Пропозиція полягає у виділенні двох маленьких бригад, які спеціалізуються в будуванні кімнат або із бетонних або із цегляних стін. Таким чином тільки ці бригади і можна буде перевозити із одного закутка міста в інше, замість того, щоб мати окремі великі команди.

Міст дозволяє розділити імплементацію від її абстракції, таким чином реалізація може бути змінена окремо від абстракції, оскільки вона не наслідується від неї напряму.

Іншими словами, наш інтерфейс IBuildingCompany може мати дві конкретні реалізації, такі як NearSeeBuildingCompany та CityBuildingCompany, кожна із яких, напевно, якось по своєму робить фундамент та дах, оскільки грунт інший і погода також, але в той же час ми можемо просто і легко змінити реалізацію бригади побудови стін - WallCreator для будь-якої із компаній, щоб будувати або цегляні або бетонні стіни.




Переглядів: 526

<== попередня сторінка | наступна сторінка ==>
Адаптер — Adapter | Уривок коду 7.1. Гляньмо на BuildingCompany

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

  

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.017 сек.