This commit is contained in:
Морозов Андрей 2022-03-29 10:52:34 +04:00
parent 6e01bc4695
commit 7959da3cd7
8 changed files with 80 additions and 57 deletions

View File

@ -1,3 +1,7 @@
// Абстрактная фабрика порождающий шаблон проектирования,
// предоставляет интерфейс для создания семейств взаимосвязанных
// или взаимозависимых объектов, не специфицируя их конкретных классов.
abstract class Drinkable { abstract class Drinkable {
void pour(); void pour();
} }

View File

@ -1,3 +1,6 @@
// структурный паттерн проектирования, который
// позволяет объектам с несовместимыми интерфейсами работать вместе
const adapteeMessage = 'Вызов адаптирующегося метода'; const adapteeMessage = 'Вызов адаптирующегося метода';
class Adaptee { class Adaptee {

View File

@ -1,3 +1,5 @@
// предоставляет способ создания составного объекта
class PizzaBuilder { class PizzaBuilder {
late String _crust; late String _crust;
int _diameter; int _diameter;
@ -59,26 +61,19 @@ class Pizza {
} }
void main() { void main() {
// Create a handy PizzaBuilder with an 8" diameter.
var pizzaBuilder = PizzaBuilder(8); var pizzaBuilder = PizzaBuilder(8);
// Add some attributes to the builder.
pizzaBuilder.crust = "deep dish"; pizzaBuilder.crust = "deep dish";
pizzaBuilder.toppings = Set.from(["pepperoni"]); pizzaBuilder.toppings = Set.from(["pepperoni"]);
// Let's make a pizza!
var plainPizza = Pizza(pizzaBuilder); var plainPizza = Pizza(pizzaBuilder);
print("Behold! $plainPizza."); print("Behold! $plainPizza.");
assert(plainPizza.toString() == "Behold! A delicous 8\" pizza with deep dish crust covered in pepperoni and cheese."); 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.crust = "gold plated";
pizzaBuilder.diameter = 72; pizzaBuilder.diameter = 72;
pizzaBuilder.toppings = Set.from(["anchovies", "caviar", "diamonds"]); 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(); var luxuriousPizza = pizzaBuilder.build();
print("Wow! $luxuriousPizza? Someone is rich!"); 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!"); assert(luxuriousPizza.toString() == "Wow! A delicous 72\" pizza with gold plated crust covered in anchovies, caviar, diamonds, and cheese? Someone is rich!");

View File

@ -1,3 +1,5 @@
//предназначен для динамического подключения дополнительного поведения к объекту
abstract class Beverage { abstract class Beverage {
double get cost; double get cost;
String get ingredients; String get ingredients;
@ -13,24 +15,26 @@ class Ingredient {
String toString() => this.name; String toString() => this.name;
} }
var coffee = Ingredient("coffee", .25); var coffee = Ingredient("кофе", .25);
var milk = Ingredient("milk", .5); var milk = Ingredient("молоко", .5);
var sugar = Ingredient("sugar", .1); var sugar = Ingredient("сахар", .1);
class Coffee implements Beverage { class Coffee implements Beverage {
Set<Ingredient> _ingredients = Set.from([coffee, milk, sugar]); Set<Ingredient> _ingredients = Set.from([coffee, milk, sugar]);
double get cost => _ingredients.fold(0, (total, i) => total + i.cost); double get cost => _ingredients.fold(0, (total, i) => total + i.cost);
String get ingredients { String get ingredients {
var stringIngredients = _ingredients.fold("", (String str, i) => str + "${i.name}, "); var stringIngredients =
var trimmedString = stringIngredients.substring(0, stringIngredients.length - 2); _ingredients.fold("", (String str, i) => str + "${i.name}, ");
var trimmedString =
stringIngredients.substring(0, stringIngredients.length - 2);
var lastComma = trimmedString.lastIndexOf(","); 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); return trimmedString.replaceRange(lastComma, lastComma + 1, replacement);
} }
} }
class StarbucksCoffeeDecorator implements Beverage { class PremiumCoffeDecorator implements Beverage {
Beverage _coffee = Coffee(); Beverage _coffee = Coffee();
double get cost => _coffee.cost * 5; double get cost => _coffee.cost * 5;
String get ingredients => _coffee.ingredients; String get ingredients => _coffee.ingredients;
@ -38,12 +42,13 @@ class StarbucksCoffeeDecorator implements Beverage {
void main() { void main() {
var coffee = Coffee(); var coffee = Coffee();
var starbucksCoffee = StarbucksCoffeeDecorator(); var premCoffee = PremiumCoffeDecorator();
print("Coffee contains ${coffee.ingredients}. It costs \$${coffee.cost}"); print(
print("Starbucks coffee contains ${starbucksCoffee.ingredients}. It costs \$${starbucksCoffee.cost}"); "Обычное кофе состоит из ${coffee.ingredients}. Оно стоит \$${coffee.cost}");
print(
"Лучшее кофе состоит из ${premCoffee.ingredients}. Оно стоит \$${premCoffee.cost}");
// Coffee contains coffee, milk, and sugar. It costs $0.85 // Coffee contains coffee, milk, and sugar. It costs $0.85
// Starbucks coffee contains coffee, milk, and sugar. It costs $4.25 // Starbucks coffee contains coffee, milk, and sugar. It costs $4.25
} }

View File

@ -1,10 +1,14 @@
//позволяющий скрыть сложность системы путём
//сведения всех возможных внешних вызовов к одному объекту,
//делегирующему их соответствующим объектам системы.
class Grinder { class Grinder {
String _type; String _type;
Grinder(this._type); Grinder(this._type);
void grind() { void grind() {
print("Grinding $_type!"); print("Перемалываю $_type!");
} }
} }
@ -14,61 +18,63 @@ class Maker {
Maker(this._type); Maker(this._type);
void fill() { void fill() {
print("Filling the $_type maker!"); print("Заполняю $_type машину!");
} }
void retrieve() { void retrieve() {
print("Retrieving the $_type!"); print("Получаю готовый $_type!");
} }
void start() { void start() {
print("Starting the $_type maker!"); print("Включаю $_type машину!");
} }
} }
class Imbiber { class Human {
String _beverage; String _beverage;
Imbiber(this._beverage); Human(this._beverage);
void drink() { void drink() {
print("Mmmmm...drinking $_beverage!"); print("Пью $_beverage!");
} }
} }
class MorningFacade { class MorningFacade {
final _coffeeDrinker = Imbiber("coffee"); final _coffeeDrinker = Human("кофе");
final _coffeeGrinder = Grinder("coffee beans"); final _coffeeGrinder = Grinder("кофейные зерна");
final _coffeeMaker = Maker("coffee"); final _coffeeMaker = Maker("кофе");
void prepareCoffee() { void prepareCoffee() {
print("\r\nPreparing the coffee..."); print("\r\Готовлю кофе...");
_coffeeGrinder.grind(); _coffeeGrinder.grind();
_coffeeMaker _coffeeMaker
..fill() ..fill()
..start(); ..start();
print("Coffee is brewing!\r\n"); print("Кофе варится!");
} }
void drinkCoffee() { void drinkCoffee() {
print("\r\nMust...have...coffee...");
_coffeeMaker.retrieve(); _coffeeMaker.retrieve();
_coffeeDrinker.drink(); _coffeeDrinker.drink();
print("This is damn fine coffee!");
} }
} }
void main() { void main() {
var typicalMorning = MorningFacade(); var typicalMorning = MorningFacade();
print("Wake up! Grab a brush and put on a little makeup..."); print("Проснулся и иду на кухню.");
print("\r\nStumble to the kitchen...");
typicalMorning.prepareCoffee(); typicalMorning.prepareCoffee();
print("Oh my...that smells good...");
typicalMorning.drinkCoffee(); typicalMorning.drinkCoffee();
print("\r\nI'm ready to attack the day!");
} }
/*
Проснулся и иду на кухню.
Готовлю кофе...
Перемалываю кофейные зерна!
Заполняю кофе машину!
Включаю кофе машину!
Кофе варится!
Получаю готовый кофе!
Пью кофе!
*/

View File

@ -1,3 +1,6 @@
//объект, представляющий себя как уникальный экземпляр
//в разных местах программы, по факту не является таковым.
import "dart:collection"; import "dart:collection";
class Letter { class Letter {

View File

@ -1,15 +1,18 @@
//в однопоточном приложении будет единственный экземпляр некоторого класса,
//и предоставляющий глобальную точку доступа к этому экземпляру.
class Me { class Me {
static final Me _singleton = new Me._internal(); static final Me _singleton = new Me._internal();
static final String _name = "Tyler"; static final String _name = "Андрей";
factory Me() { factory Me() {
return _singleton; return _singleton;
} }
static String get name => _name; static String get name => _name;
@override @override
String toString() => "Hello, my name is $name."; String toString() => "Привет, меня зовут $name.";
Me._internal(); Me._internal();
} }
@ -17,18 +20,18 @@ class Me {
void main() { void main() {
var tyler = Me(); var tyler = Me();
var anotherTyler = Me(); var anotherTyler = Me();
print(tyler); print(tyler);
print(anotherTyler); print(anotherTyler);
var samenessCheck = identical(tyler, anotherTyler) var samenessCheck = identical(tyler, anotherTyler)
? "We are both the same ${Me.name}." ? "Мы один и тот же ${Me.name}."
: "We are NOT the same. I mean, just look at us."; : "Мы даже не похожи.";
print(samenessCheck); print(samenessCheck);
/* /*
Hello, my name is Tyler. Привет, меня зовут Андрей.
Hello, my name is Tyler. Привет, меня зовут Андрей.
We are both the same Tyler. Мы один и тот же Андрей.
*/ */
} }

View File

@ -1,17 +1,21 @@
//предназначенный для определения семейства алгоритмов,
//инкапсуляции каждого из них и обеспечения их взаимозаменяемости.
//Это позволяет выбирать алгоритм путём определения соответствующего класса
abstract class CoffeeStrategy { abstract class CoffeeStrategy {
String announce(String roast); String announce(String roast);
} }
class AmericanoStrategy implements CoffeeStrategy { class AmericanoStrategy implements CoffeeStrategy {
String announce(String roast) => "Американо с $roast бобами"; String announce(String roast) => "Американо с $roast кофейными зернами";
} }
class LatteStrategy implements CoffeeStrategy { class LatteStrategy implements CoffeeStrategy {
String announce(String roast) => "Латте с $roast бобами"; String announce(String roast) => "Латте с $roast кофейными зернами";
} }
class EspressoStrategy implements CoffeeStrategy { class EspressoStrategy implements CoffeeStrategy {
String announce(String roast) => "Эспрессо с $roast бобами"; String announce(String roast) => "Эспрессо с $roast кофейными зернами";
} }
class CoffeeDrinker { class CoffeeDrinker {
@ -37,8 +41,8 @@ void main() {
} }
/* /*
Меня зовут Андрей. Я сейчас пью Латте с Итальянскими бобами! Меня зовут Андрей. Я сейчас пью Латте с Итальянскими кофейными зернами!
Меня зовут Никита. Я сейчас пью Американо с Итальянскими бобами! Меня зовут Никита. Я сейчас пью Американо с Итальянскими кофейными зернами!
Меня зовут Олег. Я сейчас пью Эспрессо с Итальянскими бобами! Меня зовут Олег. Я сейчас пью Эспрессо с Итальянскими кофейными зернами!
*/ */
} }