//предназначенный для определения семейства алгоритмов, //инкапсуляции каждого из них и обеспечения их взаимозаменяемости. //Это позволяет выбирать алгоритм путём определения соответствующего класса abstract class CoffeeStrategy { String announce(String roast); } class AmericanoStrategy implements CoffeeStrategy { String announce(String roast) => "Американо с $roast кофейными зернами"; } class LatteStrategy implements CoffeeStrategy { String announce(String roast) => "Латте с $roast кофейными зернами"; } class EspressoStrategy implements CoffeeStrategy { String announce(String roast) => "Эспрессо с $roast кофейными зернами"; } class CoffeeDrinker { CoffeeStrategy preferredDrink; String name; CoffeeDrinker(this.name, this.preferredDrink); } void main() { var americano = AmericanoStrategy(); var latte = LatteStrategy(); var espresso = EspressoStrategy(); var p1 = CoffeeDrinker("Андрей", latte); var p2 = CoffeeDrinker("Никита", americano); var p3 = CoffeeDrinker("Олег", espresso); final String roastOfTheDay = "Итальянскими"; for (var person in [p1, p2, p3]) { print( "Меня зовут ${person.name}. Я сейчас пью ${person.preferredDrink.announce(roastOfTheDay)}!\r"); } /* Меня зовут Андрей. Я сейчас пью Латте с Итальянскими кофейными зернами! Меня зовут Никита. Я сейчас пью Американо с Итальянскими кофейными зернами! Меня зовут Олег. Я сейчас пью Эспрессо с Итальянскими кофейными зернами! */ }