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 {
void pour();
}

View File

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

View File

@ -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!");

View File

@ -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<Ingredient> _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
}

View File

@ -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");
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!");
}
/*
Проснулся и иду на кухню.
Готовлю кофе...
Перемалываю кофейные зерна!
Заполняю кофе машину!
Включаю кофе машину!
Кофе варится!
Получаю готовый кофе!
Пью кофе!
*/

View File

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

View File

@ -1,6 +1,9 @@
//в однопоточном приложении будет единственный экземпляр некоторого класса,
//и предоставляющий глобальную точку доступа к этому экземпляру.
class Me {
static final Me _singleton = new Me._internal();
static final String _name = "Tyler";
static final String _name = "Андрей";
factory Me() {
return _singleton;
@ -9,7 +12,7 @@ class Me {
static String get name => _name;
@override
String toString() => "Hello, my name is $name.";
String toString() => "Привет, меня зовут $name.";
Me._internal();
}
@ -22,13 +25,13 @@ void main() {
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.
Привет, меня зовут Андрей.
Привет, меня зовут Андрей.
Мы один и тот же Андрей.
*/
}

View File

@ -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() {
}
/*
Меня зовут Андрей. Я сейчас пью Латте с Итальянскими бобами!
Меня зовут Никита. Я сейчас пью Американо с Итальянскими бобами!
Меня зовут Олег. Я сейчас пью Эспрессо с Итальянскими бобами!
Меня зовут Андрей. Я сейчас пью Латте с Итальянскими кофейными зернами!
Меня зовут Никита. Я сейчас пью Американо с Итальянскими кофейными зернами!
Меня зовут Олег. Я сейчас пью Эспрессо с Итальянскими кофейными зернами!
*/
}