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