patterns
This commit is contained in:
parent
6e01bc4695
commit
7959da3cd7
|
@ -1,3 +1,7 @@
|
|||
// Абстрактная фабрика — порождающий шаблон проектирования,
|
||||
// предоставляет интерфейс для создания семейств взаимосвязанных
|
||||
// или взаимозависимых объектов, не специфицируя их конкретных классов.
|
||||
|
||||
abstract class Drinkable {
|
||||
void pour();
|
||||
}
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
// структурный паттерн проектирования, который
|
||||
// позволяет объектам с несовместимыми интерфейсами работать вместе
|
||||
|
||||
const adapteeMessage = 'Вызов адаптирующегося метода';
|
||||
|
||||
class Adaptee {
|
||||
|
|
|
@ -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!");
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
54
facade.dart
54
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!");
|
||||
}
|
||||
|
||||
/*
|
||||
Проснулся и иду на кухню.
|
||||
Готовлю кофе...
|
||||
Перемалываю кофейные зерна!
|
||||
Заполняю кофе машину!
|
||||
Включаю кофе машину!
|
||||
Кофе варится!
|
||||
Получаю готовый кофе!
|
||||
Пью кофе!
|
||||
*/
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
//объект, представляющий себя как уникальный экземпляр
|
||||
//в разных местах программы, по факту не является таковым.
|
||||
|
||||
import "dart:collection";
|
||||
|
||||
class Letter {
|
||||
|
|
|
@ -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.
|
||||
Привет, меня зовут Андрей.
|
||||
Привет, меня зовут Андрей.
|
||||
Мы один и тот же Андрей.
|
||||
*/
|
||||
}
|
||||
|
|
|
@ -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() {
|
|||
}
|
||||
|
||||
/*
|
||||
Меня зовут Андрей. Я сейчас пью Латте с Итальянскими бобами!
|
||||
Меня зовут Никита. Я сейчас пью Американо с Итальянскими бобами!
|
||||
Меня зовут Олег. Я сейчас пью Эспрессо с Итальянскими бобами!
|
||||
Меня зовут Андрей. Я сейчас пью Латте с Итальянскими кофейными зернами!
|
||||
Меня зовут Никита. Я сейчас пью Американо с Итальянскими кофейными зернами!
|
||||
Меня зовут Олег. Я сейчас пью Эспрессо с Итальянскими кофейными зернами!
|
||||
*/
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue