From 7959da3cd721051bb3f5f36a874ad30fd23d5e1c Mon Sep 17 00:00:00 2001 From: lnd212 Date: Tue, 29 Mar 2022 10:52:34 +0400 Subject: [PATCH] patterns --- abstract_factory.dart | 4 ++++ adapter.dart | 3 +++ builder.dart | 9 ++------ decorator.dart | 27 +++++++++++++--------- facade.dart | 54 ++++++++++++++++++++++++------------------- flyweight.dart | 3 +++ singleton.dart | 21 +++++++++-------- strategy.dart | 16 ++++++++----- 8 files changed, 80 insertions(+), 57 deletions(-) diff --git a/abstract_factory.dart b/abstract_factory.dart index 8189ed2..69a2a55 100644 --- a/abstract_factory.dart +++ b/abstract_factory.dart @@ -1,3 +1,7 @@ +// Абстрактная фабрика — порождающий шаблон проектирования, +// предоставляет интерфейс для создания семейств взаимосвязанных +// или взаимозависимых объектов, не специфицируя их конкретных классов. + abstract class Drinkable { void pour(); } diff --git a/adapter.dart b/adapter.dart index aaa1371..cbea25e 100644 --- a/adapter.dart +++ b/adapter.dart @@ -1,3 +1,6 @@ +// структурный паттерн проектирования, который +// позволяет объектам с несовместимыми интерфейсами работать вместе + const adapteeMessage = 'Вызов адаптирующегося метода'; class Adaptee { diff --git a/builder.dart b/builder.dart index 2b90ea4..0cc9be5 100644 --- a/builder.dart +++ b/builder.dart @@ -1,3 +1,5 @@ +// предоставляет способ создания составного объекта + class PizzaBuilder { late String _crust; int _diameter; @@ -59,26 +61,19 @@ class Pizza { } void main() { - // Create a handy PizzaBuilder with an 8" diameter. var pizzaBuilder = PizzaBuilder(8); - // Add some attributes to the builder. pizzaBuilder.crust = "deep dish"; pizzaBuilder.toppings = Set.from(["pepperoni"]); - // Let's make a pizza! var plainPizza = Pizza(pizzaBuilder); print("Behold! $plainPizza."); assert(plainPizza.toString() == "Behold! A delicous 8\" pizza with deep dish crust covered in pepperoni and cheese."); - // Now to adjust some things for the next pizza... pizzaBuilder.crust = "gold plated"; pizzaBuilder.diameter = 72; pizzaBuilder.toppings = Set.from(["anchovies", "caviar", "diamonds"]); - // The beauty of the build is you can quickly iterate and produce instances of a class. - // For example, we have an early employee of the latest unicorn in line. So much disposable income! - // Also note, we use the .build() function of the builder this time. var luxuriousPizza = pizzaBuilder.build(); print("Wow! $luxuriousPizza? Someone is rich!"); assert(luxuriousPizza.toString() == "Wow! A delicous 72\" pizza with gold plated crust covered in anchovies, caviar, diamonds, and cheese? Someone is rich!"); diff --git a/decorator.dart b/decorator.dart index 01616eb..c1c1b32 100644 --- a/decorator.dart +++ b/decorator.dart @@ -1,3 +1,5 @@ +//предназначен для динамического подключения дополнительного поведения к объекту + abstract class Beverage { double get cost; String get ingredients; @@ -13,24 +15,26 @@ class Ingredient { String toString() => this.name; } -var coffee = Ingredient("coffee", .25); -var milk = Ingredient("milk", .5); -var sugar = Ingredient("sugar", .1); +var coffee = Ingredient("кофе", .25); +var milk = Ingredient("молоко", .5); +var sugar = Ingredient("сахар", .1); class Coffee implements Beverage { Set _ingredients = Set.from([coffee, milk, sugar]); double get cost => _ingredients.fold(0, (total, i) => total + i.cost); String get ingredients { - var stringIngredients = _ingredients.fold("", (String str, i) => str + "${i.name}, "); - var trimmedString = stringIngredients.substring(0, stringIngredients.length - 2); + var stringIngredients = + _ingredients.fold("", (String str, i) => str + "${i.name}, "); + var trimmedString = + stringIngredients.substring(0, stringIngredients.length - 2); var lastComma = trimmedString.lastIndexOf(","); - var replacement = ",".allMatches(trimmedString).length > 1 ? ", and" : " and"; + var replacement = ",".allMatches(trimmedString).length > 1 ? ", и" : " и"; return trimmedString.replaceRange(lastComma, lastComma + 1, replacement); } } -class StarbucksCoffeeDecorator implements Beverage { +class PremiumCoffeDecorator implements Beverage { Beverage _coffee = Coffee(); double get cost => _coffee.cost * 5; String get ingredients => _coffee.ingredients; @@ -38,12 +42,13 @@ class StarbucksCoffeeDecorator implements Beverage { void main() { var coffee = Coffee(); - var starbucksCoffee = StarbucksCoffeeDecorator(); + var premCoffee = PremiumCoffeDecorator(); - print("Coffee contains ${coffee.ingredients}. It costs \$${coffee.cost}"); - print("Starbucks coffee contains ${starbucksCoffee.ingredients}. It costs \$${starbucksCoffee.cost}"); + print( + "Обычное кофе состоит из ${coffee.ingredients}. Оно стоит \$${coffee.cost}"); + print( + "Лучшее кофе состоит из ${premCoffee.ingredients}. Оно стоит \$${premCoffee.cost}"); // Coffee contains coffee, milk, and sugar. It costs $0.85 // Starbucks coffee contains coffee, milk, and sugar. It costs $4.25 } - diff --git a/facade.dart b/facade.dart index 6f0fc10..796254f 100644 --- a/facade.dart +++ b/facade.dart @@ -1,10 +1,14 @@ +//позволяющий скрыть сложность системы путём +//сведения всех возможных внешних вызовов к одному объекту, +//делегирующему их соответствующим объектам системы. + class Grinder { String _type; Grinder(this._type); void grind() { - print("Grinding $_type!"); + print("Перемалываю $_type!"); } } @@ -14,61 +18,63 @@ class Maker { Maker(this._type); void fill() { - print("Filling the $_type maker!"); + print("Заполняю $_type машину!"); } void retrieve() { - print("Retrieving the $_type!"); + print("Получаю готовый $_type!"); } void start() { - print("Starting the $_type maker!"); + print("Включаю $_type машину!"); } } -class Imbiber { +class Human { String _beverage; - Imbiber(this._beverage); + Human(this._beverage); void drink() { - print("Mmmmm...drinking $_beverage!"); + print("Пью $_beverage!"); } } class MorningFacade { - final _coffeeDrinker = Imbiber("coffee"); - final _coffeeGrinder = Grinder("coffee beans"); - final _coffeeMaker = Maker("coffee"); + final _coffeeDrinker = Human("кофе"); + final _coffeeGrinder = Grinder("кофейные зерна"); + final _coffeeMaker = Maker("кофе"); void prepareCoffee() { - print("\r\nPreparing the coffee..."); + print("\r\Готовлю кофе..."); _coffeeGrinder.grind(); _coffeeMaker - ..fill() - ..start(); - print("Coffee is brewing!\r\n"); + ..fill() + ..start(); + print("Кофе варится!"); } void drinkCoffee() { - print("\r\nMust...have...coffee..."); _coffeeMaker.retrieve(); _coffeeDrinker.drink(); - print("This is damn fine coffee!"); } } void main() { var typicalMorning = MorningFacade(); - print("Wake up! Grab a brush and put on a little makeup..."); - print("\r\nStumble to the kitchen..."); - + print("Проснулся и иду на кухню."); typicalMorning.prepareCoffee(); - - print("Oh my...that smells good..."); - typicalMorning.drinkCoffee(); - - print("\r\nI'm ready to attack the day!"); } + +/* + Проснулся и иду на кухню. + Готовлю кофе... + Перемалываю кофейные зерна! + Заполняю кофе машину! + Включаю кофе машину! + Кофе варится! + Получаю готовый кофе! + Пью кофе! +*/ diff --git a/flyweight.dart b/flyweight.dart index b71f6ab..46a1175 100644 --- a/flyweight.dart +++ b/flyweight.dart @@ -1,3 +1,6 @@ +//объект, представляющий себя как уникальный экземпляр +//в разных местах программы, по факту не является таковым. + import "dart:collection"; class Letter { diff --git a/singleton.dart b/singleton.dart index 01dc8d0..07e1cff 100644 --- a/singleton.dart +++ b/singleton.dart @@ -1,15 +1,18 @@ +//в однопоточном приложении будет единственный экземпляр некоторого класса, +//и предоставляющий глобальную точку доступа к этому экземпляру. + class Me { static final Me _singleton = new Me._internal(); - static final String _name = "Tyler"; + static final String _name = "Андрей"; factory Me() { return _singleton; } static String get name => _name; - + @override - String toString() => "Hello, my name is $name."; + String toString() => "Привет, меня зовут $name."; Me._internal(); } @@ -17,18 +20,18 @@ class Me { void main() { var tyler = Me(); var anotherTyler = Me(); - + print(tyler); print(anotherTyler); var samenessCheck = identical(tyler, anotherTyler) - ? "We are both the same ${Me.name}." - : "We are NOT the same. I mean, just look at us."; + ? "Мы один и тот же ${Me.name}." + : "Мы даже не похожи."; print(samenessCheck); /* - Hello, my name is Tyler. - Hello, my name is Tyler. - We are both the same Tyler. + Привет, меня зовут Андрей. + Привет, меня зовут Андрей. + Мы один и тот же Андрей. */ } diff --git a/strategy.dart b/strategy.dart index 194d48e..97a581c 100644 --- a/strategy.dart +++ b/strategy.dart @@ -1,17 +1,21 @@ +//предназначенный для определения семейства алгоритмов, +//инкапсуляции каждого из них и обеспечения их взаимозаменяемости. +//Это позволяет выбирать алгоритм путём определения соответствующего класса + abstract class CoffeeStrategy { String announce(String roast); } class AmericanoStrategy implements CoffeeStrategy { - String announce(String roast) => "Американо с $roast бобами"; + String announce(String roast) => "Американо с $roast кофейными зернами"; } class LatteStrategy implements CoffeeStrategy { - String announce(String roast) => "Латте с $roast бобами"; + String announce(String roast) => "Латте с $roast кофейными зернами"; } class EspressoStrategy implements CoffeeStrategy { - String announce(String roast) => "Эспрессо с $roast бобами"; + String announce(String roast) => "Эспрессо с $roast кофейными зернами"; } class CoffeeDrinker { @@ -37,8 +41,8 @@ void main() { } /* - Меня зовут Андрей. Я сейчас пью Латте с Итальянскими бобами! - Меня зовут Никита. Я сейчас пью Американо с Итальянскими бобами! - Меня зовут Олег. Я сейчас пью Эспрессо с Итальянскими бобами! + Меня зовут Андрей. Я сейчас пью Латте с Итальянскими кофейными зернами! + Меня зовут Никита. Я сейчас пью Американо с Итальянскими кофейными зернами! + Меня зовут Олег. Я сейчас пью Эспрессо с Итальянскими кофейными зернами! */ }