Compare commits
32 Commits
Author | SHA1 | Date |
---|---|---|
Alexander Zhirov | ffaefeac75 | |
Alexander Zhirov | e93f2da595 | |
Alexander Zhirov | 41ff6962c3 | |
Alexander Zhirov | 9a6936ed7b | |
Alexander Zhirov | 935f9c7563 | |
Alexander Zhirov | afb0c148a1 | |
Alexander Zhirov | 38ae23f3db | |
Alexander Zhirov | 0c320c05a4 | |
Alexander Zhirov | a66b3dcbb5 | |
Alexander Zhirov | deac4ef4c7 | |
Alexander Zhirov | ecfd117aba | |
Alexander Zhirov | 94690db1ef | |
Alexander Zhirov | 949451a1f1 | |
Alexander Zhirov | 1744b158c6 | |
Alexander Zhirov | 857e6e97bb | |
Alexander Zhirov | 301e6da1a9 | |
Alexander Zhirov | 3c374df63d | |
Alexander Zhirov | 91e4cafaa9 | |
Alexander Zhirov | 9091f51cfa | |
Alexander Zhirov | 9a7cf7f6f8 | |
Alexander Zhirov | 0aabb39e79 | |
Alexander Zhirov | 8bfa03ce82 | |
Alexander Zhirov | f9c95af5ff | |
Alexander Zhirov | f197ef0255 | |
Alexander Zhirov | 90c1b88af9 | |
Alexander Zhirov | e815172862 | |
Alexander Zhirov | b6e1ec089c | |
Alexander Zhirov | 850cb17d02 | |
Alexander Zhirov | 8170c93255 | |
Alexander Zhirov | ddbfb4820c | |
Alexander Zhirov | e9712fdf28 | |
Alexander Zhirov | 8284e0f476 |
|
@ -0,0 +1,2 @@
|
||||||
|
app
|
||||||
|
app.o
|
40
README.md
|
@ -1,3 +1,39 @@
|
||||||
# Паттерны проектирования
|
# Паттерны проектирования на языке D
|
||||||
|
|
||||||
Паттерны проектирования на различных языках программирования по книге [Head First. Паттерны проектирования](https://ftp.zhirov.kz/books/IT/%D0%9F%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD%D1%8B/Head%20First.%20%D0%9F%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD%D1%8B%20%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%28%D0%AD%D1%80%D0%B8%D0%BA%20%D0%A4%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%2C%20%D0%AD%D0%BB%D0%B8%D0%B7%D0%B0%D0%B1%D0%B5%D1%82%20%D0%A0%D0%BE%D0%B1%D1%81%D0%BE%D0%BD%29%202022.pdf)
|
Паттерны проектирования по книге [Head First. Паттерны проектирования](https://ftp.zhirov.kz/books/IT/%D0%9F%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD%D1%8B/Head%20First.%20%D0%9F%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD%D1%8B%20%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%28%D0%AD%D1%80%D0%B8%D0%BA%20%D0%A4%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%2C%20%D0%AD%D0%BB%D0%B8%D0%B7%D0%B0%D0%B1%D0%B5%D1%82%20%D0%A0%D0%BE%D0%B1%D1%81%D0%BE%D0%BD%29%202022.pdf) ([исходный код на Java](Head-First-Design-Patterns-master.zip))
|
||||||
|
|
||||||
|
## Паттерны
|
||||||
|
|
||||||
|
### Поведенческие
|
||||||
|
|
||||||
|
1. [Стратегия](strategy/)
|
||||||
|
2. [Наблюдатель](observer/)
|
||||||
|
3. [Команда](command/)
|
||||||
|
4. [Шаблонный метод](templatemethod/)
|
||||||
|
5. [Итератор](iterator/)
|
||||||
|
6. [Состояние](state/)
|
||||||
|
|
||||||
|
### Структурные
|
||||||
|
|
||||||
|
1. [Декоратор](decorator/)
|
||||||
|
2. [Адаптер](adapter/)
|
||||||
|
3. [Фасад](facade/)
|
||||||
|
4. [Компоновщик](composite/)
|
||||||
|
|
||||||
|
### Пораждающие
|
||||||
|
|
||||||
|
1. [Фабричный метод (Простая фабрика)](factorymethod/)
|
||||||
|
2. [Абстрактная фабрика](abstractfactory/)
|
||||||
|
3. [Одиночка](singleton/)
|
||||||
|
|
||||||
|
## Компиляция
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dmd *.d
|
||||||
|
```
|
||||||
|
|
||||||
|
или
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ldc2 *.d
|
||||||
|
```
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
# Абстрактная фабрика
|
||||||
|
|
||||||
|
Порождающий паттерн проектирования, который позволяет создавать семейства связанных объектов, не привязываясь к конкретным классам создаваемых объектов.
|
||||||
|
|
||||||
|
Паттерн **Абстрактная Фабрика** предоставляет интерфейс создания семейств взаимосвязанных или взаимозависимых объектов без указания их конкретных классов.
|
||||||
|
|
||||||
|
## Принципы
|
||||||
|
|
||||||
|
- Код должен зависеть от абстракций, а не от конкретных классов
|
||||||
|
|
||||||
|
## Схемы
|
||||||
|
|
||||||
|
![scheme-1](scheme-1.png)
|
||||||
|
|
||||||
|
![scheme-2](scheme-2.png)
|
|
@ -0,0 +1,37 @@
|
||||||
|
module abstractfactory.app;
|
||||||
|
|
||||||
|
import abstractfactory.pizza;
|
||||||
|
import abstractfactory.pizzastore;
|
||||||
|
import abstractfactory.nypizzastore;
|
||||||
|
import abstractfactory.chicagopizzastore;
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
PizzaStore nyStore = new NYPizzaStore();
|
||||||
|
PizzaStore chicagoStore = new ChicagoPizzaStore();
|
||||||
|
|
||||||
|
Pizza pizza = nyStore.orderPizza("cheese");
|
||||||
|
writeln("Ethan ordered a ", pizza);
|
||||||
|
|
||||||
|
pizza = chicagoStore.orderPizza("cheese");
|
||||||
|
writeln("Joel ordered a ", pizza);
|
||||||
|
|
||||||
|
pizza = nyStore.orderPizza("clam");
|
||||||
|
writeln("Ethan ordered a ", pizza);
|
||||||
|
|
||||||
|
pizza = chicagoStore.orderPizza("clam");
|
||||||
|
writeln("Joel ordered a ", pizza);
|
||||||
|
|
||||||
|
pizza = nyStore.orderPizza("pepperoni");
|
||||||
|
writeln("Ethan ordered a ", pizza);
|
||||||
|
|
||||||
|
pizza = chicagoStore.orderPizza("pepperoni");
|
||||||
|
writeln("Joel ordered a ", pizza);
|
||||||
|
|
||||||
|
pizza = nyStore.orderPizza("veggie");
|
||||||
|
writeln("Ethan ordered a ", pizza);
|
||||||
|
|
||||||
|
pizza = chicagoStore.orderPizza("veggie");
|
||||||
|
writeln("Joel ordered a ", pizza);
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
module abstractfactory.blackolives;
|
||||||
|
|
||||||
|
import abstractfactory.veggies;
|
||||||
|
|
||||||
|
class BlackOlives : Veggies
|
||||||
|
{
|
||||||
|
override string toString() const @safe pure nothrow
|
||||||
|
{
|
||||||
|
return "Black Olives";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
module abstractfactory.cheese;
|
||||||
|
|
||||||
|
interface Cheese
|
||||||
|
{
|
||||||
|
string opBinary(string op : "~")(string s) const
|
||||||
|
{
|
||||||
|
return (cast(Object)this).toString() ~ s;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
module abstractfactory.cheesepizza;
|
||||||
|
|
||||||
|
import abstractfactory.pizza;
|
||||||
|
import abstractfactory.pizzaingredientfactory;
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
class CheesePizza : Pizza
|
||||||
|
{
|
||||||
|
PizzaIngredientFactory ingredientFactory;
|
||||||
|
|
||||||
|
this(PizzaIngredientFactory ingredientFactory)
|
||||||
|
{
|
||||||
|
this.ingredientFactory = ingredientFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
override void prepare()
|
||||||
|
{
|
||||||
|
writeln("Preparing ", name);
|
||||||
|
dough = ingredientFactory.createDough();
|
||||||
|
sauce = ingredientFactory.createSauce();
|
||||||
|
cheese = ingredientFactory.createCheese();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
module abstractfactory.chicagopizzaingredientfactory;
|
||||||
|
|
||||||
|
import abstractfactory.pizzaingredientfactory;
|
||||||
|
import abstractfactory.dough;
|
||||||
|
import abstractfactory.thickcrustdough;
|
||||||
|
import abstractfactory.sauce;
|
||||||
|
import abstractfactory.plumtomatosauce;
|
||||||
|
import abstractfactory.cheese;
|
||||||
|
import abstractfactory.mozzarellacheese;
|
||||||
|
import abstractfactory.veggies;
|
||||||
|
import abstractfactory.blackolives;
|
||||||
|
import abstractfactory.spinach;
|
||||||
|
import abstractfactory.eggplant;
|
||||||
|
import abstractfactory.pepperoni;
|
||||||
|
import abstractfactory.slicedpepperoni;
|
||||||
|
import abstractfactory.clams;
|
||||||
|
import abstractfactory.frozenclams;
|
||||||
|
|
||||||
|
class ChicagoPizzaIngredientFactory : PizzaIngredientFactory
|
||||||
|
{
|
||||||
|
override Dough createDough()
|
||||||
|
{
|
||||||
|
return new ThinCrustDough();
|
||||||
|
}
|
||||||
|
|
||||||
|
override Sauce createSauce()
|
||||||
|
{
|
||||||
|
return new PlumTomatoSauce();
|
||||||
|
}
|
||||||
|
|
||||||
|
override Cheese createCheese()
|
||||||
|
{
|
||||||
|
return new MozzarellaCheese();
|
||||||
|
}
|
||||||
|
|
||||||
|
override Veggies[] createVeggies()
|
||||||
|
{
|
||||||
|
Veggies[] veggies = cast(Veggies[])[ new BlackOlives(), new Spinach(), new Eggplant() ];
|
||||||
|
return veggies;
|
||||||
|
}
|
||||||
|
|
||||||
|
override Pepperoni createPepperoni()
|
||||||
|
{
|
||||||
|
return new SlicedPepperoni();
|
||||||
|
}
|
||||||
|
|
||||||
|
override Clams createClam()
|
||||||
|
{
|
||||||
|
return new FrozenClams();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
module abstractfactory.chicagopizzastore;
|
||||||
|
|
||||||
|
import abstractfactory.pizza;
|
||||||
|
import abstractfactory.pizzastore;
|
||||||
|
import abstractfactory.pizzaingredientfactory;
|
||||||
|
import abstractfactory.chicagopizzaingredientfactory;
|
||||||
|
import abstractfactory.cheesepizza;
|
||||||
|
import abstractfactory.veggiepizza;
|
||||||
|
import abstractfactory.clampizza;
|
||||||
|
import abstractfactory.pepperonipizza;
|
||||||
|
|
||||||
|
class ChicagoPizzaStore : PizzaStore
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
override Pizza createPizza(string item)
|
||||||
|
{
|
||||||
|
Pizza pizza;
|
||||||
|
PizzaIngredientFactory ingredientFactory = new ChicagoPizzaIngredientFactory();
|
||||||
|
|
||||||
|
if (item == "cheese")
|
||||||
|
{
|
||||||
|
pizza = new CheesePizza(ingredientFactory);
|
||||||
|
pizza.setName("Chicago Style Cheese Pizza");
|
||||||
|
}
|
||||||
|
else if (item == "veggie")
|
||||||
|
{
|
||||||
|
pizza = new VeggiePizza(ingredientFactory);
|
||||||
|
pizza.setName("Chicago Style Veggie Pizza");
|
||||||
|
}
|
||||||
|
else if (item == "clam")
|
||||||
|
{
|
||||||
|
pizza = new ClamPizza(ingredientFactory);
|
||||||
|
pizza.setName("Chicago Style Clam Pizza");
|
||||||
|
}
|
||||||
|
else if (item == "pepperoni")
|
||||||
|
{
|
||||||
|
pizza = new PepperoniPizza(ingredientFactory);
|
||||||
|
pizza.setName("Chicago Style Pepperoni Pizza");
|
||||||
|
}
|
||||||
|
|
||||||
|
return pizza;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
module abstractfactory.clampizza;
|
||||||
|
|
||||||
|
import abstractfactory.pizza;
|
||||||
|
import abstractfactory.pizzaingredientfactory;
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
class ClamPizza : Pizza
|
||||||
|
{
|
||||||
|
PizzaIngredientFactory ingredientFactory;
|
||||||
|
|
||||||
|
this(PizzaIngredientFactory ingredientFactory)
|
||||||
|
{
|
||||||
|
this.ingredientFactory = ingredientFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
override void prepare()
|
||||||
|
{
|
||||||
|
writeln("Preparing ", name);
|
||||||
|
dough = ingredientFactory.createDough();
|
||||||
|
sauce = ingredientFactory.createSauce();
|
||||||
|
cheese = ingredientFactory.createCheese();
|
||||||
|
clams = ingredientFactory.createClam();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
module abstractfactory.clams;
|
||||||
|
|
||||||
|
interface Clams
|
||||||
|
{
|
||||||
|
string opBinary(string op : "~")(string s) const
|
||||||
|
{
|
||||||
|
return (cast(Object)this).toString() ~ s;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
module abstractfactory.dough;
|
||||||
|
|
||||||
|
interface Dough
|
||||||
|
{
|
||||||
|
string opBinary(string op : "~")(string s) const
|
||||||
|
{
|
||||||
|
return (cast(Object)this).toString() ~ s;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
module abstractfactory.eggplant;
|
||||||
|
|
||||||
|
import abstractfactory.veggies;
|
||||||
|
|
||||||
|
class Eggplant : Veggies
|
||||||
|
{
|
||||||
|
override string toString() const @safe pure nothrow
|
||||||
|
{
|
||||||
|
return "Eggplant";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
module abstractfactory.freshclams;
|
||||||
|
|
||||||
|
import abstractfactory.clams;
|
||||||
|
|
||||||
|
class FreshClams : Clams
|
||||||
|
{
|
||||||
|
override string toString() const @safe pure nothrow
|
||||||
|
{
|
||||||
|
return "Fresh Clams from Long Island Sound";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
module abstractfactory.frozenclams;
|
||||||
|
|
||||||
|
import abstractfactory.clams;
|
||||||
|
|
||||||
|
class FrozenClams : Clams
|
||||||
|
{
|
||||||
|
override string toString() const @safe pure nothrow
|
||||||
|
{
|
||||||
|
return "Frozen Clams from Chesapeake Bay";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
module abstractfactory.garlic;
|
||||||
|
|
||||||
|
import abstractfactory.veggies;
|
||||||
|
|
||||||
|
class Garlic : Veggies
|
||||||
|
{
|
||||||
|
override string toString() const @safe pure nothrow
|
||||||
|
{
|
||||||
|
return "Garlic";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
module abstractfactory.marinarasauce;
|
||||||
|
|
||||||
|
import abstractfactory.sauce;
|
||||||
|
|
||||||
|
class MarinaraSauce : Sauce
|
||||||
|
{
|
||||||
|
override string toString() const @safe pure nothrow
|
||||||
|
{
|
||||||
|
return "Marinara Sauce";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
module abstractfactory.mozzarellacheese;
|
||||||
|
|
||||||
|
import abstractfactory.cheese;
|
||||||
|
|
||||||
|
class MozzarellaCheese : Cheese
|
||||||
|
{
|
||||||
|
override string toString() const @safe pure nothrow
|
||||||
|
{
|
||||||
|
return "Shredded Mozzarella";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
module abstractfactory.mushroom;
|
||||||
|
|
||||||
|
import abstractfactory.veggies;
|
||||||
|
|
||||||
|
class Mushroom : Veggies
|
||||||
|
{
|
||||||
|
override string toString() const @safe pure nothrow
|
||||||
|
{
|
||||||
|
return "Mushroom";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
module abstractfactory.nypizzaingredientfactory;
|
||||||
|
|
||||||
|
import abstractfactory.pizzaingredientfactory;
|
||||||
|
import abstractfactory.dough;
|
||||||
|
import abstractfactory.thincrustdough;
|
||||||
|
import abstractfactory.sauce;
|
||||||
|
import abstractfactory.marinarasauce;
|
||||||
|
import abstractfactory.cheese;
|
||||||
|
import abstractfactory.reggianocheese;
|
||||||
|
import abstractfactory.veggies;
|
||||||
|
import abstractfactory.garlic;
|
||||||
|
import abstractfactory.onion;
|
||||||
|
import abstractfactory.mushroom;
|
||||||
|
import abstractfactory.redpepper;
|
||||||
|
import abstractfactory.pepperoni;
|
||||||
|
import abstractfactory.slicedpepperoni;
|
||||||
|
import abstractfactory.clams;
|
||||||
|
import abstractfactory.freshclams;
|
||||||
|
|
||||||
|
class NYPizzaIngredientFactory : PizzaIngredientFactory
|
||||||
|
{
|
||||||
|
override Dough createDough()
|
||||||
|
{
|
||||||
|
return new ThinCrustDough();
|
||||||
|
}
|
||||||
|
|
||||||
|
override Sauce createSauce()
|
||||||
|
{
|
||||||
|
return new MarinaraSauce();
|
||||||
|
}
|
||||||
|
|
||||||
|
override Cheese createCheese()
|
||||||
|
{
|
||||||
|
return new ReggianoCheese();
|
||||||
|
}
|
||||||
|
|
||||||
|
override Veggies[] createVeggies()
|
||||||
|
{
|
||||||
|
Veggies[] veggies = cast(Veggies[])[ new Garlic(), new Onion(), new Mushroom(), new RedPepper() ];
|
||||||
|
return veggies;
|
||||||
|
}
|
||||||
|
|
||||||
|
override Pepperoni createPepperoni()
|
||||||
|
{
|
||||||
|
return new SlicedPepperoni();
|
||||||
|
}
|
||||||
|
|
||||||
|
override Clams createClam()
|
||||||
|
{
|
||||||
|
return new FreshClams();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
module abstractfactory.nypizzastore;
|
||||||
|
|
||||||
|
import abstractfactory.pizza;
|
||||||
|
import abstractfactory.pizzastore;
|
||||||
|
import abstractfactory.pizzaingredientfactory;
|
||||||
|
import abstractfactory.nypizzaingredientfactory;
|
||||||
|
import abstractfactory.cheesepizza;
|
||||||
|
import abstractfactory.veggiepizza;
|
||||||
|
import abstractfactory.clampizza;
|
||||||
|
import abstractfactory.pepperonipizza;
|
||||||
|
|
||||||
|
class NYPizzaStore : PizzaStore
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
override Pizza createPizza(string item)
|
||||||
|
{
|
||||||
|
Pizza pizza;
|
||||||
|
PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory();
|
||||||
|
|
||||||
|
if (item == "cheese")
|
||||||
|
{
|
||||||
|
pizza = new CheesePizza(ingredientFactory);
|
||||||
|
pizza.setName("New York Style Cheese Pizza");
|
||||||
|
}
|
||||||
|
else if (item == "veggie")
|
||||||
|
{
|
||||||
|
pizza = new VeggiePizza(ingredientFactory);
|
||||||
|
pizza.setName("New York Style Veggie Pizza");
|
||||||
|
}
|
||||||
|
else if (item == "clam")
|
||||||
|
{
|
||||||
|
pizza = new ClamPizza(ingredientFactory);
|
||||||
|
pizza.setName("New York Style Clam Pizza");
|
||||||
|
}
|
||||||
|
else if (item == "pepperoni")
|
||||||
|
{
|
||||||
|
pizza = new PepperoniPizza(ingredientFactory);
|
||||||
|
pizza.setName("New York Style Pepperoni Pizza");
|
||||||
|
}
|
||||||
|
|
||||||
|
return pizza;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
module abstractfactory.onion;
|
||||||
|
|
||||||
|
import abstractfactory.veggies;
|
||||||
|
|
||||||
|
class Onion : Veggies
|
||||||
|
{
|
||||||
|
override string toString() const @safe pure nothrow
|
||||||
|
{
|
||||||
|
return "Onion";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
module abstractfactory.pepperoni;
|
||||||
|
|
||||||
|
interface Pepperoni
|
||||||
|
{
|
||||||
|
string opBinary(string op : "~")(string s) const
|
||||||
|
{
|
||||||
|
return (cast(Object)this).toString() ~ s;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
module abstractfactory.pepperonipizza;
|
||||||
|
|
||||||
|
import abstractfactory.pizza;
|
||||||
|
import abstractfactory.pizzaingredientfactory;
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
class PepperoniPizza : Pizza
|
||||||
|
{
|
||||||
|
PizzaIngredientFactory ingredientFactory;
|
||||||
|
|
||||||
|
this(PizzaIngredientFactory ingredientFactory)
|
||||||
|
{
|
||||||
|
this.ingredientFactory = ingredientFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
override void prepare()
|
||||||
|
{
|
||||||
|
writeln("Preparing ", name);
|
||||||
|
dough = ingredientFactory.createDough();
|
||||||
|
sauce = ingredientFactory.createSauce();
|
||||||
|
cheese = ingredientFactory.createCheese();
|
||||||
|
veggies = ingredientFactory.createVeggies();
|
||||||
|
pepperoni = ingredientFactory.createPepperoni();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,88 @@
|
||||||
|
module abstractfactory.pizza;
|
||||||
|
|
||||||
|
import abstractfactory.dough;
|
||||||
|
import abstractfactory.sauce;
|
||||||
|
import abstractfactory.veggies;
|
||||||
|
import abstractfactory.cheese;
|
||||||
|
import abstractfactory.pepperoni;
|
||||||
|
import abstractfactory.clams;
|
||||||
|
import std.stdio : writeln;
|
||||||
|
import std.conv : to;
|
||||||
|
|
||||||
|
abstract class Pizza
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
string name;
|
||||||
|
Dough dough;
|
||||||
|
Sauce sauce;
|
||||||
|
Veggies[] veggies;
|
||||||
|
Cheese cheese;
|
||||||
|
Pepperoni pepperoni;
|
||||||
|
Clams clams;
|
||||||
|
public:
|
||||||
|
void prepare();
|
||||||
|
|
||||||
|
void bake()
|
||||||
|
{
|
||||||
|
writeln("Bake for 25 minutes at 350");
|
||||||
|
}
|
||||||
|
|
||||||
|
void cut()
|
||||||
|
{
|
||||||
|
writeln("Cut the pizza into diagonal slices");
|
||||||
|
}
|
||||||
|
|
||||||
|
void box()
|
||||||
|
{
|
||||||
|
writeln("Place pizza in official PizzaStore box");
|
||||||
|
}
|
||||||
|
|
||||||
|
void setName(string name)
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
string getName()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
override string toString() const
|
||||||
|
{
|
||||||
|
string s;
|
||||||
|
s ~= "---- " ~ name ~ " ----\n";
|
||||||
|
if (dough !is null)
|
||||||
|
{
|
||||||
|
s ~= dough ~ "\n";
|
||||||
|
}
|
||||||
|
if (sauce !is null)
|
||||||
|
{
|
||||||
|
s ~= sauce ~ "\n";
|
||||||
|
}
|
||||||
|
if (cheese !is null)
|
||||||
|
{
|
||||||
|
s ~= cheese ~ "\n";
|
||||||
|
}
|
||||||
|
if (veggies.length)
|
||||||
|
{
|
||||||
|
foreach (key, val; veggies)
|
||||||
|
{
|
||||||
|
s ~= val.to!string;
|
||||||
|
if (key + 1 < veggies.length)
|
||||||
|
{
|
||||||
|
s ~= ", ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (clams !is null)
|
||||||
|
{
|
||||||
|
s ~= clams ~ "\n";
|
||||||
|
}
|
||||||
|
if (pepperoni !is null)
|
||||||
|
{
|
||||||
|
s ~= pepperoni ~ "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
module abstractfactory.pizzaingredientfactory;
|
||||||
|
|
||||||
|
import abstractfactory.dough;
|
||||||
|
import abstractfactory.sauce;
|
||||||
|
import abstractfactory.cheese;
|
||||||
|
import abstractfactory.veggies;
|
||||||
|
import abstractfactory.pepperoni;
|
||||||
|
import abstractfactory.clams;
|
||||||
|
|
||||||
|
interface PizzaIngredientFactory
|
||||||
|
{
|
||||||
|
Dough createDough();
|
||||||
|
Sauce createSauce();
|
||||||
|
Cheese createCheese();
|
||||||
|
Veggies[] createVeggies();
|
||||||
|
Pepperoni createPepperoni();
|
||||||
|
Clams createClam();
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
module abstractfactory.pizzastore;
|
||||||
|
|
||||||
|
import abstractfactory.pizza;
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
abstract class PizzaStore
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
Pizza createPizza(string item);
|
||||||
|
public:
|
||||||
|
Pizza orderPizza(string type)
|
||||||
|
{
|
||||||
|
Pizza pizza = createPizza(type);
|
||||||
|
|
||||||
|
writeln("--- Making a " ~ pizza.getName() ~ " ---");
|
||||||
|
|
||||||
|
pizza.prepare();
|
||||||
|
pizza.bake();
|
||||||
|
pizza.cut();
|
||||||
|
pizza.box();
|
||||||
|
|
||||||
|
return pizza;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
module abstractfactory.plumtomatosauce;
|
||||||
|
|
||||||
|
import abstractfactory.sauce;
|
||||||
|
|
||||||
|
class PlumTomatoSauce : Sauce
|
||||||
|
{
|
||||||
|
override string toString() const @safe pure nothrow
|
||||||
|
{
|
||||||
|
return "Tomato sauce with plum tomatoes";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
module abstractfactory.redpepper;
|
||||||
|
|
||||||
|
import abstractfactory.veggies;
|
||||||
|
|
||||||
|
class RedPepper : Veggies
|
||||||
|
{
|
||||||
|
override string toString() const @safe pure nothrow
|
||||||
|
{
|
||||||
|
return "Red Pepper";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
module abstractfactory.reggianocheese;
|
||||||
|
|
||||||
|
import abstractfactory.cheese;
|
||||||
|
|
||||||
|
class ReggianoCheese : Cheese
|
||||||
|
{
|
||||||
|
override string toString() const @safe pure nothrow
|
||||||
|
{
|
||||||
|
return "Reggiano Cheese";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
module abstractfactory.sauce;
|
||||||
|
|
||||||
|
interface Sauce
|
||||||
|
{
|
||||||
|
string opBinary(string op : "~")(string s) const
|
||||||
|
{
|
||||||
|
return (cast(Object)this).toString() ~ s;
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 375 KiB |
After Width: | Height: | Size: 449 KiB |
|
@ -0,0 +1,11 @@
|
||||||
|
module abstractfactory.slicedpepperoni;
|
||||||
|
|
||||||
|
import abstractfactory.pepperoni;
|
||||||
|
|
||||||
|
class SlicedPepperoni : Pepperoni
|
||||||
|
{
|
||||||
|
override string toString() const @safe pure nothrow
|
||||||
|
{
|
||||||
|
return "Sliced Pepperoni";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
module abstractfactory.spinach;
|
||||||
|
|
||||||
|
import abstractfactory.veggies;
|
||||||
|
|
||||||
|
class Spinach : Veggies
|
||||||
|
{
|
||||||
|
override string toString() const @safe pure nothrow
|
||||||
|
{
|
||||||
|
return "Spinach";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
module abstractfactory.thickcrustdough;
|
||||||
|
|
||||||
|
import abstractfactory.dough;
|
||||||
|
|
||||||
|
class ThinCrustDough : Dough
|
||||||
|
{
|
||||||
|
override string toString() const @safe pure nothrow
|
||||||
|
{
|
||||||
|
return "ThickCrust style extra thick crust dough";
|
||||||
|
}
|
||||||
|
|
||||||
|
string opBinary(string op : "~")(string s)
|
||||||
|
{
|
||||||
|
return (cast(Object)this).toString() ~ s;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
module abstractfactory.thincrustdough;
|
||||||
|
|
||||||
|
import abstractfactory.dough;
|
||||||
|
|
||||||
|
class ThinCrustDough : Dough
|
||||||
|
{
|
||||||
|
override string toString() const @safe pure nothrow
|
||||||
|
{
|
||||||
|
return "Thin Crust Dough";
|
||||||
|
}
|
||||||
|
|
||||||
|
string opBinary(string op : "~")(string s)
|
||||||
|
{
|
||||||
|
return (cast(Object)this).toString() ~ s;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
module abstractfactory.veggiepizza;
|
||||||
|
|
||||||
|
import abstractfactory.pizza;
|
||||||
|
import abstractfactory.pizzaingredientfactory;
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
class VeggiePizza : Pizza
|
||||||
|
{
|
||||||
|
PizzaIngredientFactory ingredientFactory;
|
||||||
|
|
||||||
|
this(PizzaIngredientFactory ingredientFactory)
|
||||||
|
{
|
||||||
|
this.ingredientFactory = ingredientFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
override void prepare()
|
||||||
|
{
|
||||||
|
writeln("Preparing ", name);
|
||||||
|
dough = ingredientFactory.createDough();
|
||||||
|
sauce = ingredientFactory.createSauce();
|
||||||
|
cheese = ingredientFactory.createCheese();
|
||||||
|
veggies = ingredientFactory.createVeggies();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
module abstractfactory.veggies;
|
||||||
|
|
||||||
|
interface Veggies
|
||||||
|
{
|
||||||
|
string opBinary(string op : "~")(string s) const
|
||||||
|
{
|
||||||
|
return (cast(Object)this).toString() ~ s;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
# Адаптер
|
||||||
|
|
||||||
|
Структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.
|
||||||
|
|
||||||
|
Паттерн **Адаптер** преобразует интерфейс класса к другому интерфейсу, на который рассчитан клиент. Адаптер обеспечивает совместную работу классов, невозможную в обычных условиях из-за несовместимости интерфейсов.
|
||||||
|
|
||||||
|
## Схемы
|
||||||
|
|
||||||
|
![scheme-1](scheme-1.png)
|
||||||
|
|
||||||
|
![scheme-2](scheme-2.png)
|
||||||
|
|
||||||
|
![scheme-3](scheme-3.png)
|
||||||
|
|
||||||
|
![scheme-4](scheme-4.png)
|
||||||
|
|
||||||
|
![scheme-5](scheme-5.png)
|
||||||
|
|
||||||
|
![scheme-6](scheme-6.png)
|
After Width: | Height: | Size: 197 KiB |
After Width: | Height: | Size: 104 KiB |
After Width: | Height: | Size: 61 KiB |
After Width: | Height: | Size: 52 KiB |
After Width: | Height: | Size: 161 KiB |
After Width: | Height: | Size: 205 KiB |
|
@ -0,0 +1,28 @@
|
||||||
|
module app;
|
||||||
|
|
||||||
|
import lib;
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
Duck duck = new MallardDuck();
|
||||||
|
|
||||||
|
Turkey turkey = new WildTurkey();
|
||||||
|
Duck turkeyAdapter = new TurkeyAdapter(turkey);
|
||||||
|
|
||||||
|
writeln("The Turkey says...");
|
||||||
|
turkey.gobble();
|
||||||
|
turkey.fly();
|
||||||
|
|
||||||
|
writeln("\nThe Duck says...");
|
||||||
|
testDuck(duck);
|
||||||
|
|
||||||
|
writeln("\nThe TurkeyAdapter says...");
|
||||||
|
testDuck(turkeyAdapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testDuck(Duck duck)
|
||||||
|
{
|
||||||
|
duck.quack();
|
||||||
|
duck.fly();
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
module lib.duck;
|
||||||
|
|
||||||
|
interface Duck
|
||||||
|
{
|
||||||
|
void quack();
|
||||||
|
void fly();
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
module lib.mallarduck;
|
||||||
|
|
||||||
|
import lib.duck;
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
class MallardDuck : Duck
|
||||||
|
{
|
||||||
|
void quack()
|
||||||
|
{
|
||||||
|
writeln("Quack!");
|
||||||
|
}
|
||||||
|
|
||||||
|
void fly()
|
||||||
|
{
|
||||||
|
writeln("I'm flying");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
module lib;
|
||||||
|
|
||||||
|
public import lib.duck;
|
||||||
|
public import lib.mallarduck;
|
||||||
|
public import lib.turkey;
|
||||||
|
public import lib.turkeyadapter;
|
||||||
|
public import lib.wildturkey;
|
|
@ -0,0 +1,7 @@
|
||||||
|
module lib.turkey;
|
||||||
|
|
||||||
|
interface Turkey
|
||||||
|
{
|
||||||
|
void gobble();
|
||||||
|
void fly();
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
module lib.turkeyadapter;
|
||||||
|
|
||||||
|
import lib.turkey;
|
||||||
|
import lib.duck;
|
||||||
|
|
||||||
|
class TurkeyAdapter : Duck
|
||||||
|
{
|
||||||
|
Turkey turkey;
|
||||||
|
|
||||||
|
this(Turkey turkey)
|
||||||
|
{
|
||||||
|
this.turkey = turkey;
|
||||||
|
}
|
||||||
|
|
||||||
|
void quack()
|
||||||
|
{
|
||||||
|
turkey.gobble();
|
||||||
|
}
|
||||||
|
|
||||||
|
void fly()
|
||||||
|
{
|
||||||
|
foreach (val; 0..5)
|
||||||
|
{
|
||||||
|
turkey.fly();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
module lib.wildturkey;
|
||||||
|
|
||||||
|
import lib.turkey;
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
class WildTurkey : Turkey
|
||||||
|
{
|
||||||
|
void gobble()
|
||||||
|
{
|
||||||
|
writeln("Gobble gobble");
|
||||||
|
}
|
||||||
|
|
||||||
|
void fly()
|
||||||
|
{
|
||||||
|
writeln("I'm flying a short distance");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
# Команда
|
||||||
|
|
||||||
|
Поведенческий паттерн проектирования, который превращает запросы в объекты, позволяя передавать их как аргументы при вызове методов, ставить запросы в очередь, логировать их, а также поддерживать отмену операций.
|
||||||
|
|
||||||
|
Паттерн **Команда** инкапсулирует запрос в виде объекта, делая возможной параметризацию клиентских объектов с другими запросами, организацию очереди или регистрацию запросов, а также поддержку отмены операций.
|
||||||
|
|
||||||
|
## Схемы
|
||||||
|
|
||||||
|
![scheme-1](scheme-1.png)
|
||||||
|
|
||||||
|
![scheme-2](scheme-2.png)
|
||||||
|
|
||||||
|
![scheme-3](scheme-3.png)
|
|
@ -0,0 +1,57 @@
|
||||||
|
module command.remote.app;
|
||||||
|
|
||||||
|
import command.remote.remotecontrol;
|
||||||
|
import command.remote.lightoncommand;
|
||||||
|
import command.remote.lightoffcommand;
|
||||||
|
import command.remote.light;
|
||||||
|
import command.remote.ceilingfan;
|
||||||
|
import command.remote.ceilingfanoffcommand;
|
||||||
|
import command.remote.ceilingfanoncommand;
|
||||||
|
import command.remote.garagedoorupcommand;
|
||||||
|
import command.remote.garagedoordowncommand;
|
||||||
|
import command.remote.garagedoor;
|
||||||
|
import command.remote.stereoonwithcdcommand;
|
||||||
|
import command.remote.stereo;
|
||||||
|
import command.remote.stereooffcommand;
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
auto remoteControl = new RemoteControl();
|
||||||
|
|
||||||
|
auto livingRoomLight = new Light("Living Room");
|
||||||
|
auto kitchenLight = new Light("Kitchen");
|
||||||
|
auto ceilingFan = new CeilingFan("Living Room");
|
||||||
|
auto garageDoor = new GarageDoor("Garage");
|
||||||
|
auto stereo = new Stereo("Living Room");
|
||||||
|
|
||||||
|
auto livingRoomLightOn = new LightOnCommand(livingRoomLight);
|
||||||
|
auto livingRoomLightOff = new LightOffCommand(livingRoomLight);
|
||||||
|
auto kitchenLightOn = new LightOnCommand(kitchenLight);
|
||||||
|
auto kitchenLightOff = new LightOffCommand(kitchenLight);
|
||||||
|
auto ceilingFanOn = new CeilingFanOnCommand(ceilingFan);
|
||||||
|
auto ceilingFanOff = new CeilingFanOffCommand(ceilingFan);
|
||||||
|
auto garageDoorUp = new GarageDoorUpCommand(garageDoor);
|
||||||
|
auto garageDoorDown = new GarageDoorDownCommand(garageDoor);
|
||||||
|
auto stereoOnWithCD = new StereoOnWithCDCommand(stereo);
|
||||||
|
auto stereoOff = new StereoOffCommand(stereo);
|
||||||
|
|
||||||
|
remoteControl.setCommand(0, livingRoomLightOn, livingRoomLightOff);
|
||||||
|
remoteControl.setCommand(1, kitchenLightOn, kitchenLightOff);
|
||||||
|
remoteControl.setCommand(2, ceilingFanOn, ceilingFanOff);
|
||||||
|
remoteControl.setCommand(3, stereoOnWithCD, stereoOff);
|
||||||
|
remoteControl.setCommand(4, garageDoorUp, garageDoorDown);
|
||||||
|
|
||||||
|
writeln(remoteControl);
|
||||||
|
|
||||||
|
remoteControl.onButtonWasPressed(0);
|
||||||
|
remoteControl.offButtonWasPressed(0);
|
||||||
|
remoteControl.onButtonWasPressed(1);
|
||||||
|
remoteControl.offButtonWasPressed(1);
|
||||||
|
remoteControl.onButtonWasPressed(2);
|
||||||
|
remoteControl.offButtonWasPressed(2);
|
||||||
|
remoteControl.onButtonWasPressed(3);
|
||||||
|
remoteControl.offButtonWasPressed(3);
|
||||||
|
remoteControl.onButtonWasPressed(4);
|
||||||
|
remoteControl.offButtonWasPressed(4);
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
module command.remote.ceilingfan;
|
||||||
|
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
class CeilingFan
|
||||||
|
{
|
||||||
|
private string location;
|
||||||
|
private int level;
|
||||||
|
|
||||||
|
static int HIGH = 2;
|
||||||
|
static int MEDIUM = 1;
|
||||||
|
static int LOW = 0;
|
||||||
|
|
||||||
|
this(string location)
|
||||||
|
{
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
void high()
|
||||||
|
{
|
||||||
|
level = HIGH;
|
||||||
|
writeln(location ~ " ceiling fan is on high");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void medium()
|
||||||
|
{
|
||||||
|
level = MEDIUM;
|
||||||
|
writeln(location ~ " ceiling fan is on medium");
|
||||||
|
}
|
||||||
|
|
||||||
|
void low()
|
||||||
|
{
|
||||||
|
level = LOW;
|
||||||
|
writeln(location ~ " ceiling fan is on low");
|
||||||
|
}
|
||||||
|
|
||||||
|
void off()
|
||||||
|
{
|
||||||
|
level = 0;
|
||||||
|
writeln(location ~ " ceiling fan is off");
|
||||||
|
}
|
||||||
|
|
||||||
|
int getSpeed()
|
||||||
|
{
|
||||||
|
return level;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
module command.remote.ceilingfanoffcommand;
|
||||||
|
|
||||||
|
import command.remote.command;
|
||||||
|
import command.remote.ceilingfan;
|
||||||
|
|
||||||
|
class CeilingFanOffCommand : Command
|
||||||
|
{
|
||||||
|
CeilingFan ceilingFan;
|
||||||
|
|
||||||
|
this(CeilingFan ceilingFan)
|
||||||
|
{
|
||||||
|
this.ceilingFan = ceilingFan;
|
||||||
|
}
|
||||||
|
|
||||||
|
override void execute()
|
||||||
|
{
|
||||||
|
ceilingFan.off();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
module command.remote.ceilingfanoncommand;
|
||||||
|
|
||||||
|
import command.remote.command;
|
||||||
|
import command.remote.ceilingfan;
|
||||||
|
|
||||||
|
class CeilingFanOnCommand : Command
|
||||||
|
{
|
||||||
|
CeilingFan ceilingFan;
|
||||||
|
|
||||||
|
this(CeilingFan ceilingFan)
|
||||||
|
{
|
||||||
|
this.ceilingFan = ceilingFan;
|
||||||
|
}
|
||||||
|
|
||||||
|
override void execute()
|
||||||
|
{
|
||||||
|
ceilingFan.high();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
module command.remote.command;
|
||||||
|
|
||||||
|
interface Command
|
||||||
|
{
|
||||||
|
void execute();
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
module command.remote.garagedoor;
|
||||||
|
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
class GarageDoor
|
||||||
|
{
|
||||||
|
private string location;
|
||||||
|
|
||||||
|
this(string location)
|
||||||
|
{
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
void up()
|
||||||
|
{
|
||||||
|
writeln(location ~ " garage Door is Up");
|
||||||
|
}
|
||||||
|
|
||||||
|
void down()
|
||||||
|
{
|
||||||
|
writeln(location ~ " garage Door is Down");
|
||||||
|
}
|
||||||
|
|
||||||
|
void stop()
|
||||||
|
{
|
||||||
|
writeln(location ~ " garage Door is Stopped");
|
||||||
|
}
|
||||||
|
|
||||||
|
void lightOn()
|
||||||
|
{
|
||||||
|
writeln(location ~ " garage light is on");
|
||||||
|
}
|
||||||
|
|
||||||
|
void lightOff()
|
||||||
|
{
|
||||||
|
writeln(location ~ " garage light is off");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
module command.remote.garagedoordowncommand;
|
||||||
|
|
||||||
|
import command.remote.command;
|
||||||
|
import command.remote.garagedoor;
|
||||||
|
|
||||||
|
class GarageDoorDownCommand : Command
|
||||||
|
{
|
||||||
|
GarageDoor garageDoor;
|
||||||
|
|
||||||
|
this(GarageDoor garageDoor)
|
||||||
|
{
|
||||||
|
this.garageDoor = garageDoor;
|
||||||
|
}
|
||||||
|
|
||||||
|
override void execute()
|
||||||
|
{
|
||||||
|
garageDoor.down();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
module command.remote.garagedoorupcommand;
|
||||||
|
|
||||||
|
import command.remote.command;
|
||||||
|
import command.remote.garagedoor;
|
||||||
|
|
||||||
|
class GarageDoorUpCommand : Command
|
||||||
|
{
|
||||||
|
GarageDoor garageDoor;
|
||||||
|
|
||||||
|
this(GarageDoor garageDoor)
|
||||||
|
{
|
||||||
|
this.garageDoor = garageDoor;
|
||||||
|
}
|
||||||
|
|
||||||
|
override void execute()
|
||||||
|
{
|
||||||
|
garageDoor.up();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
module command.remote.light;
|
||||||
|
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
class Light
|
||||||
|
{
|
||||||
|
private string location;
|
||||||
|
|
||||||
|
this(string location)
|
||||||
|
{
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
void on()
|
||||||
|
{
|
||||||
|
writeln(location ~ " light is On");
|
||||||
|
}
|
||||||
|
|
||||||
|
void off()
|
||||||
|
{
|
||||||
|
writeln(location ~ " light is Off");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
module command.remote.lightoffcommand;
|
||||||
|
|
||||||
|
import command.remote.command;
|
||||||
|
import command.remote.light;
|
||||||
|
|
||||||
|
class LightOffCommand : Command
|
||||||
|
{
|
||||||
|
Light light;
|
||||||
|
|
||||||
|
this(Light light)
|
||||||
|
{
|
||||||
|
this.light = light;
|
||||||
|
}
|
||||||
|
|
||||||
|
override void execute()
|
||||||
|
{
|
||||||
|
light.off();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
module command.remote.lightoncommand;
|
||||||
|
|
||||||
|
import command.remote.command;
|
||||||
|
import command.remote.light;
|
||||||
|
|
||||||
|
class LightOnCommand : Command
|
||||||
|
{
|
||||||
|
Light light;
|
||||||
|
|
||||||
|
this(Light light)
|
||||||
|
{
|
||||||
|
this.light = light;
|
||||||
|
}
|
||||||
|
|
||||||
|
override void execute()
|
||||||
|
{
|
||||||
|
light.on();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
module command.remote.nocommand;
|
||||||
|
|
||||||
|
import command.remote.command;
|
||||||
|
|
||||||
|
class NoCommand : Command
|
||||||
|
{
|
||||||
|
override void execute() {}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
module command.remote.remotecontrol;
|
||||||
|
|
||||||
|
import command.remote.command;
|
||||||
|
import command.remote.nocommand;
|
||||||
|
import std.conv : to;
|
||||||
|
import std.stdio : writeln;
|
||||||
|
import std.algorithm.mutation : fill;
|
||||||
|
import std.array : split, back;
|
||||||
|
import std.format;
|
||||||
|
|
||||||
|
class RemoteControl
|
||||||
|
{
|
||||||
|
Command[] onCommands;
|
||||||
|
Command[] offCommands;
|
||||||
|
|
||||||
|
this()
|
||||||
|
{
|
||||||
|
onCommands = new Command[7];
|
||||||
|
offCommands = new Command[7];
|
||||||
|
Command noCommand = new NoCommand();
|
||||||
|
fill(onCommands, noCommand);
|
||||||
|
fill(offCommands, noCommand);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setCommand(int slot, Command onCommand, Command offCommand)
|
||||||
|
{
|
||||||
|
onCommands[slot] = onCommand;
|
||||||
|
offCommands[slot] = offCommand;
|
||||||
|
}
|
||||||
|
|
||||||
|
void onButtonWasPressed(int slot)
|
||||||
|
{
|
||||||
|
onCommands[slot].execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
void offButtonWasPressed(int slot)
|
||||||
|
{
|
||||||
|
offCommands[slot].execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
override string toString() const
|
||||||
|
{
|
||||||
|
string s = "\n------ Remote Control -------\n";
|
||||||
|
for (int i = 0; i < 7; ++i)
|
||||||
|
{
|
||||||
|
s ~= "[slot " ~ i.to!string ~ "] "
|
||||||
|
~ format("%22s", (cast(Object)onCommands[i]).classinfo.name.split(".").back())
|
||||||
|
~ format("%23s", (cast(Object)offCommands[i]).classinfo.name.split(".").back())
|
||||||
|
~ "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
module command.remote.stereo;
|
||||||
|
|
||||||
|
import std.stdio : writeln;
|
||||||
|
import std.conv : to;
|
||||||
|
|
||||||
|
class Stereo
|
||||||
|
{
|
||||||
|
string location;
|
||||||
|
|
||||||
|
this(string location)
|
||||||
|
{
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
void on()
|
||||||
|
{
|
||||||
|
writeln(location ~ " stereo is on");
|
||||||
|
}
|
||||||
|
|
||||||
|
void off()
|
||||||
|
{
|
||||||
|
writeln(location ~ " stereo is off");
|
||||||
|
}
|
||||||
|
|
||||||
|
void setCD()
|
||||||
|
{
|
||||||
|
writeln(location ~ " stereo is set for CD input");
|
||||||
|
}
|
||||||
|
|
||||||
|
void setDVD()
|
||||||
|
{
|
||||||
|
writeln(location ~ " stereo is set for DVD input");
|
||||||
|
}
|
||||||
|
|
||||||
|
void setRadio()
|
||||||
|
{
|
||||||
|
writeln(location ~ " stereo is set for Radio");
|
||||||
|
}
|
||||||
|
|
||||||
|
void setVolume(int volume)
|
||||||
|
{
|
||||||
|
writeln(location ~ " stereo volume set to " ~ volume.to!string);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
module command.remote.stereooffcommand;
|
||||||
|
|
||||||
|
import command.remote.command;
|
||||||
|
import command.remote.stereo;
|
||||||
|
|
||||||
|
class StereoOffCommand : Command
|
||||||
|
{
|
||||||
|
Stereo stereo;
|
||||||
|
|
||||||
|
this(Stereo stereo)
|
||||||
|
{
|
||||||
|
this.stereo = stereo;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
stereo.off();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
module command.remote.stereoonwithcdcommand;
|
||||||
|
|
||||||
|
import command.remote.command;
|
||||||
|
import command.remote.stereo;
|
||||||
|
|
||||||
|
class StereoOnWithCDCommand : Command
|
||||||
|
{
|
||||||
|
Stereo stereo;
|
||||||
|
|
||||||
|
this(Stereo stereo)
|
||||||
|
{
|
||||||
|
this.stereo = stereo;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
stereo.on();
|
||||||
|
stereo.setCD();
|
||||||
|
stereo.setVolume(11);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
module command.remoteundo.app;
|
||||||
|
|
||||||
|
import command.remoteundo.remotecontrol;
|
||||||
|
import command.remoteundo.lightoncommand;
|
||||||
|
import command.remoteundo.lightoffcommand;
|
||||||
|
import command.remoteundo.light;
|
||||||
|
import command.remoteundo.ceilingfan;
|
||||||
|
import command.remoteundo.ceilingfanoffcommand;
|
||||||
|
import command.remoteundo.ceilingfanoncommand;
|
||||||
|
import command.remoteundo.garagedoorupcommand;
|
||||||
|
import command.remoteundo.garagedoordowncommand;
|
||||||
|
import command.remoteundo.garagedoor;
|
||||||
|
import command.remoteundo.stereoonwithcdcommand;
|
||||||
|
import command.remoteundo.stereo;
|
||||||
|
import command.remoteundo.stereooffcommand;
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
auto remoteControl = new RemoteControl();
|
||||||
|
|
||||||
|
auto livingRoomLight = new Light("Living Room");
|
||||||
|
// auto kitchenLight = new Light("Kitchen");
|
||||||
|
// auto ceilingFan = new CeilingFan("Living Room");
|
||||||
|
// auto garageDoor = new GarageDoor("Garage");
|
||||||
|
// auto stereo = new Stereo("Living Room");
|
||||||
|
|
||||||
|
remoteControl.setCommand(0, new LightOnCommand(livingRoomLight), new LightOffCommand(livingRoomLight));
|
||||||
|
// remoteControl.setCommand(1, new LightOnCommand(kitchenLight), new LightOffCommand(kitchenLight));
|
||||||
|
// remoteControl.setCommand(2, new CeilingFanOnCommand(ceilingFan), new CeilingFanOffCommand(ceilingFan));
|
||||||
|
// remoteControl.setCommand(3, new StereoOnWithCDCommand(stereo), new StereoOffCommand(stereo));
|
||||||
|
// remoteControl.setCommand(4, new GarageDoorUpCommand(garageDoor), new GarageDoorDownCommand(garageDoor));
|
||||||
|
|
||||||
|
// writeln(remoteControl);
|
||||||
|
|
||||||
|
remoteControl.onButtonWasPushed(0);
|
||||||
|
remoteControl.offButtonWasPushed(0);
|
||||||
|
writeln(remoteControl);
|
||||||
|
remoteControl.undoButtonWasPushed();
|
||||||
|
remoteControl.offButtonWasPushed(0);
|
||||||
|
remoteControl.onButtonWasPushed(0);
|
||||||
|
writeln(remoteControl);
|
||||||
|
remoteControl.undoButtonWasPushed();
|
||||||
|
// remoteControl.onButtonWasPushed(1);
|
||||||
|
// remoteControl.offButtonWasPushed(1);
|
||||||
|
// remoteControl.onButtonWasPushed(2);
|
||||||
|
// remoteControl.offButtonWasPushed(2);
|
||||||
|
// remoteControl.onButtonWasPushed(3);
|
||||||
|
// remoteControl.offButtonWasPushed(3);
|
||||||
|
// remoteControl.onButtonWasPushed(4);
|
||||||
|
// remoteControl.offButtonWasPushed(4);
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
module command.remoteundo.ceilingfan;
|
||||||
|
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
class CeilingFan
|
||||||
|
{
|
||||||
|
private string location;
|
||||||
|
private int level;
|
||||||
|
|
||||||
|
static int HIGH = 2;
|
||||||
|
static int MEDIUM = 1;
|
||||||
|
static int LOW = 0;
|
||||||
|
|
||||||
|
this(string location)
|
||||||
|
{
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
void high()
|
||||||
|
{
|
||||||
|
level = HIGH;
|
||||||
|
writeln(location ~ " ceiling fan is on high");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void medium()
|
||||||
|
{
|
||||||
|
level = MEDIUM;
|
||||||
|
writeln(location ~ " ceiling fan is on medium");
|
||||||
|
}
|
||||||
|
|
||||||
|
void low()
|
||||||
|
{
|
||||||
|
level = LOW;
|
||||||
|
writeln(location ~ " ceiling fan is on low");
|
||||||
|
}
|
||||||
|
|
||||||
|
void off()
|
||||||
|
{
|
||||||
|
level = 0;
|
||||||
|
writeln(location ~ " ceiling fan is off");
|
||||||
|
}
|
||||||
|
|
||||||
|
int getSpeed()
|
||||||
|
{
|
||||||
|
return level;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
module command.remoteundo.ceilingfanoffcommand;
|
||||||
|
|
||||||
|
import command.remoteundo.command;
|
||||||
|
import command.remoteundo.ceilingfan;
|
||||||
|
|
||||||
|
class CeilingFanOffCommand : Command
|
||||||
|
{
|
||||||
|
CeilingFan ceilingFan;
|
||||||
|
|
||||||
|
this(CeilingFan ceilingFan)
|
||||||
|
{
|
||||||
|
this.ceilingFan = ceilingFan;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
ceilingFan.off();
|
||||||
|
}
|
||||||
|
|
||||||
|
void undo()
|
||||||
|
{
|
||||||
|
ceilingFan.high();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
module command.remoteundo.ceilingfanoncommand;
|
||||||
|
|
||||||
|
import command.remoteundo.command;
|
||||||
|
import command.remoteundo.ceilingfan;
|
||||||
|
|
||||||
|
class CeilingFanOnCommand : Command
|
||||||
|
{
|
||||||
|
CeilingFan ceilingFan;
|
||||||
|
|
||||||
|
this(CeilingFan ceilingFan)
|
||||||
|
{
|
||||||
|
this.ceilingFan = ceilingFan;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
ceilingFan.high();
|
||||||
|
}
|
||||||
|
|
||||||
|
void undo()
|
||||||
|
{
|
||||||
|
ceilingFan.off();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
module command.remoteundo.command;
|
||||||
|
|
||||||
|
interface Command
|
||||||
|
{
|
||||||
|
void execute();
|
||||||
|
void undo();
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
module command.remoteundo.garagedoor;
|
||||||
|
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
class GarageDoor
|
||||||
|
{
|
||||||
|
private string location;
|
||||||
|
|
||||||
|
this(string location)
|
||||||
|
{
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
void up()
|
||||||
|
{
|
||||||
|
writeln(location ~ " garage Door is Up");
|
||||||
|
}
|
||||||
|
|
||||||
|
void down()
|
||||||
|
{
|
||||||
|
writeln(location ~ " garage Door is Down");
|
||||||
|
}
|
||||||
|
|
||||||
|
void stop()
|
||||||
|
{
|
||||||
|
writeln(location ~ " garage Door is Stopped");
|
||||||
|
}
|
||||||
|
|
||||||
|
void lightOn()
|
||||||
|
{
|
||||||
|
writeln(location ~ " garage light is on");
|
||||||
|
}
|
||||||
|
|
||||||
|
void lightOff()
|
||||||
|
{
|
||||||
|
writeln(location ~ " garage light is off");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
module command.remoteundo.garagedoordowncommand;
|
||||||
|
|
||||||
|
import command.remoteundo.command;
|
||||||
|
import command.remoteundo.garagedoor;
|
||||||
|
|
||||||
|
class GarageDoorDownCommand : Command
|
||||||
|
{
|
||||||
|
GarageDoor garageDoor;
|
||||||
|
|
||||||
|
this(GarageDoor garageDoor)
|
||||||
|
{
|
||||||
|
this.garageDoor = garageDoor;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
garageDoor.down();
|
||||||
|
}
|
||||||
|
|
||||||
|
void undo()
|
||||||
|
{
|
||||||
|
garageDoor.up();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
module command.remoteundo.garagedoorupcommand;
|
||||||
|
|
||||||
|
import command.remoteundo.command;
|
||||||
|
import command.remoteundo.garagedoor;
|
||||||
|
|
||||||
|
class GarageDoorUpCommand : Command
|
||||||
|
{
|
||||||
|
GarageDoor garageDoor;
|
||||||
|
|
||||||
|
this(GarageDoor garageDoor)
|
||||||
|
{
|
||||||
|
this.garageDoor = garageDoor;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
garageDoor.up();
|
||||||
|
}
|
||||||
|
|
||||||
|
void undo()
|
||||||
|
{
|
||||||
|
garageDoor.down();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
module command.remoteundo.light;
|
||||||
|
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
class Light
|
||||||
|
{
|
||||||
|
private string location;
|
||||||
|
|
||||||
|
this(string location)
|
||||||
|
{
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
void on()
|
||||||
|
{
|
||||||
|
writeln(location ~ " light is On");
|
||||||
|
}
|
||||||
|
|
||||||
|
void off()
|
||||||
|
{
|
||||||
|
writeln(location ~ " light is Off");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
module command.remoteundo.lightoffcommand;
|
||||||
|
|
||||||
|
import command.remoteundo.command;
|
||||||
|
import command.remoteundo.light;
|
||||||
|
|
||||||
|
class LightOffCommand : Command
|
||||||
|
{
|
||||||
|
Light light;
|
||||||
|
|
||||||
|
this(Light light)
|
||||||
|
{
|
||||||
|
this.light = light;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
light.off();
|
||||||
|
}
|
||||||
|
|
||||||
|
void undo()
|
||||||
|
{
|
||||||
|
light.on();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
module command.remoteundo.lightoncommand;
|
||||||
|
|
||||||
|
import command.remoteundo.command;
|
||||||
|
import command.remoteundo.light;
|
||||||
|
|
||||||
|
class LightOnCommand : Command
|
||||||
|
{
|
||||||
|
Light light;
|
||||||
|
|
||||||
|
this(Light light)
|
||||||
|
{
|
||||||
|
this.light = light;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
light.on();
|
||||||
|
}
|
||||||
|
|
||||||
|
void undo()
|
||||||
|
{
|
||||||
|
light.off();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
module command.remoteundo.nocommand;
|
||||||
|
|
||||||
|
import command.remoteundo.command;
|
||||||
|
|
||||||
|
class NoCommand : Command
|
||||||
|
{
|
||||||
|
void execute() {}
|
||||||
|
void undo() {}
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
module command.remoteundo.remotecontrol;
|
||||||
|
|
||||||
|
import command.remoteundo.command;
|
||||||
|
import command.remoteundo.nocommand;
|
||||||
|
import std.conv : to;
|
||||||
|
import std.stdio : writeln;
|
||||||
|
import std.algorithm.mutation : fill;
|
||||||
|
import std.array : split, back;
|
||||||
|
import std.format;
|
||||||
|
|
||||||
|
class RemoteControl
|
||||||
|
{
|
||||||
|
Command[] onCommands;
|
||||||
|
Command[] offCommands;
|
||||||
|
Command undoCommand;
|
||||||
|
|
||||||
|
this()
|
||||||
|
{
|
||||||
|
onCommands = new Command[7];
|
||||||
|
offCommands = new Command[7];
|
||||||
|
Command noCommand = new NoCommand();
|
||||||
|
fill(onCommands, noCommand);
|
||||||
|
fill(offCommands, noCommand);
|
||||||
|
undoCommand = noCommand;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setCommand(int slot, Command onCommand, Command offCommand)
|
||||||
|
{
|
||||||
|
onCommands[slot] = onCommand;
|
||||||
|
offCommands[slot] = offCommand;
|
||||||
|
}
|
||||||
|
|
||||||
|
void onButtonWasPushed(int slot)
|
||||||
|
{
|
||||||
|
onCommands[slot].execute();
|
||||||
|
undoCommand = onCommands[slot];
|
||||||
|
}
|
||||||
|
|
||||||
|
void offButtonWasPushed(int slot)
|
||||||
|
{
|
||||||
|
offCommands[slot].execute();
|
||||||
|
undoCommand = offCommands[slot];
|
||||||
|
}
|
||||||
|
|
||||||
|
void undoButtonWasPushed()
|
||||||
|
{
|
||||||
|
undoCommand.undo();
|
||||||
|
}
|
||||||
|
|
||||||
|
override string toString() const
|
||||||
|
{
|
||||||
|
string s = "\n------ Remote Control -------\n";
|
||||||
|
for (int i = 0; i < 7; ++i)
|
||||||
|
{
|
||||||
|
s ~= "[slot " ~ i.to!string ~ "] "
|
||||||
|
~ format("%22s", (cast(Object)onCommands[i]).classinfo.name.split(".").back())
|
||||||
|
~ format("%23s", (cast(Object)offCommands[i]).classinfo.name.split(".").back())
|
||||||
|
~ "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return s ~ "[undo] " ~ (cast(Object)undoCommand).classinfo.name.split(".").back() ~ "\n";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
module command.remoteundo.stereo;
|
||||||
|
|
||||||
|
import std.stdio : writeln;
|
||||||
|
import std.conv : to;
|
||||||
|
|
||||||
|
class Stereo
|
||||||
|
{
|
||||||
|
string location;
|
||||||
|
|
||||||
|
this(string location)
|
||||||
|
{
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
void on()
|
||||||
|
{
|
||||||
|
writeln(location ~ " stereo is on");
|
||||||
|
}
|
||||||
|
|
||||||
|
void off()
|
||||||
|
{
|
||||||
|
writeln(location ~ " stereo is off");
|
||||||
|
}
|
||||||
|
|
||||||
|
void setCD()
|
||||||
|
{
|
||||||
|
writeln(location ~ " stereo is set for CD input");
|
||||||
|
}
|
||||||
|
|
||||||
|
void setDVD()
|
||||||
|
{
|
||||||
|
writeln(location ~ " stereo is set for DVD input");
|
||||||
|
}
|
||||||
|
|
||||||
|
void setRadio()
|
||||||
|
{
|
||||||
|
writeln(location ~ " stereo is set for Radio");
|
||||||
|
}
|
||||||
|
|
||||||
|
void setVolume(int volume)
|
||||||
|
{
|
||||||
|
writeln(location ~ " stereo volume set to " ~ volume.to!string);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
module command.remoteundo.stereooffcommand;
|
||||||
|
|
||||||
|
import command.remoteundo.command;
|
||||||
|
import command.remoteundo.stereo;
|
||||||
|
|
||||||
|
class StereoOffCommand : Command
|
||||||
|
{
|
||||||
|
Stereo stereo;
|
||||||
|
|
||||||
|
this(Stereo stereo)
|
||||||
|
{
|
||||||
|
this.stereo = stereo;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
stereo.off();
|
||||||
|
}
|
||||||
|
|
||||||
|
void undo()
|
||||||
|
{
|
||||||
|
stereo.on();
|
||||||
|
stereo.setCD();
|
||||||
|
stereo.setVolume(11);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
module command.remoteundo.stereoonwithcdcommand;
|
||||||
|
|
||||||
|
import command.remoteundo.command;
|
||||||
|
import command.remoteundo.stereo;
|
||||||
|
|
||||||
|
class StereoOnWithCDCommand : Command
|
||||||
|
{
|
||||||
|
Stereo stereo;
|
||||||
|
|
||||||
|
this(Stereo stereo)
|
||||||
|
{
|
||||||
|
this.stereo = stereo;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
stereo.on();
|
||||||
|
stereo.setCD();
|
||||||
|
stereo.setVolume(11);
|
||||||
|
}
|
||||||
|
|
||||||
|
void undo()
|
||||||
|
{
|
||||||
|
stereo.off();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
module command.remoteundostatus.app;
|
||||||
|
|
||||||
|
import command.remoteundostatus.remotecontrol;
|
||||||
|
import command.remoteundostatus.lightoncommand;
|
||||||
|
import command.remoteundostatus.lightoffcommand;
|
||||||
|
import command.remoteundostatus.light;
|
||||||
|
import command.remoteundostatus.ceilingfan;
|
||||||
|
import command.remoteundostatus.ceilingfanoffcommand;
|
||||||
|
import command.remoteundostatus.ceilingfanhighcommand;
|
||||||
|
import command.remoteundostatus.ceilingfanmediumcommand;
|
||||||
|
import command.remoteundostatus.ceilingfanlowcommand;
|
||||||
|
import command.remoteundostatus.garagedoorupcommand;
|
||||||
|
import command.remoteundostatus.garagedoordowncommand;
|
||||||
|
import command.remoteundostatus.garagedoor;
|
||||||
|
import command.remoteundostatus.stereoonwithcdcommand;
|
||||||
|
import command.remoteundostatus.stereo;
|
||||||
|
import command.remoteundostatus.stereooffcommand;
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
auto remoteControl = new RemoteControl();
|
||||||
|
|
||||||
|
auto ceilingFan = new CeilingFan("Living Room");
|
||||||
|
|
||||||
|
remoteControl.setCommand(0, new CeilingFanMediumCommand(ceilingFan), new CeilingFanOffCommand(ceilingFan));
|
||||||
|
remoteControl.setCommand(1, new CeilingFanHighCommand(ceilingFan), new CeilingFanOffCommand(ceilingFan));
|
||||||
|
|
||||||
|
remoteControl.onButtonWasPushed(0);
|
||||||
|
remoteControl.offButtonWasPushed(0);
|
||||||
|
writeln(remoteControl);
|
||||||
|
remoteControl.undoButtonWasPushed();
|
||||||
|
remoteControl.onButtonWasPushed(1);
|
||||||
|
writeln(remoteControl);
|
||||||
|
remoteControl.undoButtonWasPushed();
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
module command.remoteundostatus.ceilingfan;
|
||||||
|
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
class CeilingFan
|
||||||
|
{
|
||||||
|
private string location;
|
||||||
|
private int speed;
|
||||||
|
|
||||||
|
static const int HIGH = 3;
|
||||||
|
static const int MEDIUM = 2;
|
||||||
|
static const int LOW = 1;
|
||||||
|
static const int OFF = 0;
|
||||||
|
|
||||||
|
this(string location)
|
||||||
|
{
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
void high()
|
||||||
|
{
|
||||||
|
speed = HIGH;
|
||||||
|
writeln(location ~ " ceiling fan is on high");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void medium()
|
||||||
|
{
|
||||||
|
speed = MEDIUM;
|
||||||
|
writeln(location ~ " ceiling fan is on medium");
|
||||||
|
}
|
||||||
|
|
||||||
|
void low()
|
||||||
|
{
|
||||||
|
speed = LOW;
|
||||||
|
writeln(location ~ " ceiling fan is on low");
|
||||||
|
}
|
||||||
|
|
||||||
|
void off()
|
||||||
|
{
|
||||||
|
speed = OFF;
|
||||||
|
writeln(location ~ " ceiling fan is off");
|
||||||
|
}
|
||||||
|
|
||||||
|
int getSpeed()
|
||||||
|
{
|
||||||
|
return speed;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
module command.remoteundostatus.ceilingfanhighcommand;
|
||||||
|
|
||||||
|
import command.remoteundostatus.command;
|
||||||
|
import command.remoteundostatus.ceilingfan;
|
||||||
|
|
||||||
|
class CeilingFanHighCommand : Command
|
||||||
|
{
|
||||||
|
CeilingFan ceilingFan;
|
||||||
|
int prevSpeed;
|
||||||
|
|
||||||
|
this(CeilingFan ceilingFan)
|
||||||
|
{
|
||||||
|
this.ceilingFan = ceilingFan;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
prevSpeed = ceilingFan.getSpeed();
|
||||||
|
ceilingFan.high();
|
||||||
|
}
|
||||||
|
|
||||||
|
void undo()
|
||||||
|
{
|
||||||
|
switch (prevSpeed)
|
||||||
|
{
|
||||||
|
case CeilingFan.HIGH:
|
||||||
|
ceilingFan.high();
|
||||||
|
break;
|
||||||
|
case CeilingFan.MEDIUM:
|
||||||
|
ceilingFan.medium();
|
||||||
|
break;
|
||||||
|
case CeilingFan.LOW:
|
||||||
|
ceilingFan.low();
|
||||||
|
break;
|
||||||
|
case CeilingFan.OFF:
|
||||||
|
ceilingFan.off();
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
module command.remoteundostatus.ceilingfanlowcommand;
|
||||||
|
|
||||||
|
import command.remoteundostatus.command;
|
||||||
|
import command.remoteundostatus.ceilingfan;
|
||||||
|
|
||||||
|
class CeilingFanLowCommand : Command
|
||||||
|
{
|
||||||
|
CeilingFan ceilingFan;
|
||||||
|
int prevSpeed;
|
||||||
|
|
||||||
|
this(CeilingFan ceilingFan)
|
||||||
|
{
|
||||||
|
this.ceilingFan = ceilingFan;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
prevSpeed = ceilingFan.getSpeed();
|
||||||
|
ceilingFan.low();
|
||||||
|
}
|
||||||
|
|
||||||
|
void undo()
|
||||||
|
{
|
||||||
|
switch (prevSpeed)
|
||||||
|
{
|
||||||
|
case CeilingFan.HIGH:
|
||||||
|
ceilingFan.high();
|
||||||
|
break;
|
||||||
|
case CeilingFan.MEDIUM:
|
||||||
|
ceilingFan.medium();
|
||||||
|
break;
|
||||||
|
case CeilingFan.LOW:
|
||||||
|
ceilingFan.low();
|
||||||
|
break;
|
||||||
|
case CeilingFan.OFF:
|
||||||
|
ceilingFan.off();
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
module command.remoteundostatus.ceilingfanmediumcommand;
|
||||||
|
|
||||||
|
import command.remoteundostatus.command;
|
||||||
|
import command.remoteundostatus.ceilingfan;
|
||||||
|
|
||||||
|
class CeilingFanMediumCommand : Command
|
||||||
|
{
|
||||||
|
CeilingFan ceilingFan;
|
||||||
|
int prevSpeed;
|
||||||
|
|
||||||
|
this(CeilingFan ceilingFan)
|
||||||
|
{
|
||||||
|
this.ceilingFan = ceilingFan;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
prevSpeed = ceilingFan.getSpeed();
|
||||||
|
ceilingFan.medium();
|
||||||
|
}
|
||||||
|
|
||||||
|
void undo()
|
||||||
|
{
|
||||||
|
switch (prevSpeed)
|
||||||
|
{
|
||||||
|
case CeilingFan.HIGH:
|
||||||
|
ceilingFan.high();
|
||||||
|
break;
|
||||||
|
case CeilingFan.MEDIUM:
|
||||||
|
ceilingFan.medium();
|
||||||
|
break;
|
||||||
|
case CeilingFan.LOW:
|
||||||
|
ceilingFan.low();
|
||||||
|
break;
|
||||||
|
case CeilingFan.OFF:
|
||||||
|
ceilingFan.off();
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
module command.remoteundostatus.ceilingfanoffcommand;
|
||||||
|
|
||||||
|
import command.remoteundostatus.command;
|
||||||
|
import command.remoteundostatus.ceilingfan;
|
||||||
|
|
||||||
|
class CeilingFanOffCommand : Command
|
||||||
|
{
|
||||||
|
CeilingFan ceilingFan;
|
||||||
|
int prevSpeed;
|
||||||
|
|
||||||
|
this(CeilingFan ceilingFan)
|
||||||
|
{
|
||||||
|
this.ceilingFan = ceilingFan;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
prevSpeed = ceilingFan.getSpeed();
|
||||||
|
ceilingFan.off();
|
||||||
|
}
|
||||||
|
|
||||||
|
void undo()
|
||||||
|
{
|
||||||
|
switch (prevSpeed)
|
||||||
|
{
|
||||||
|
case CeilingFan.HIGH:
|
||||||
|
ceilingFan.high();
|
||||||
|
break;
|
||||||
|
case CeilingFan.MEDIUM:
|
||||||
|
ceilingFan.medium();
|
||||||
|
break;
|
||||||
|
case CeilingFan.LOW:
|
||||||
|
ceilingFan.low();
|
||||||
|
break;
|
||||||
|
case CeilingFan.OFF:
|
||||||
|
ceilingFan.off();
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
module command.remoteundostatus.command;
|
||||||
|
|
||||||
|
interface Command
|
||||||
|
{
|
||||||
|
void execute();
|
||||||
|
void undo();
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
module command.remoteundostatus.garagedoor;
|
||||||
|
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
class GarageDoor
|
||||||
|
{
|
||||||
|
private string location;
|
||||||
|
|
||||||
|
this(string location)
|
||||||
|
{
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
void up()
|
||||||
|
{
|
||||||
|
writeln(location ~ " garage Door is Up");
|
||||||
|
}
|
||||||
|
|
||||||
|
void down()
|
||||||
|
{
|
||||||
|
writeln(location ~ " garage Door is Down");
|
||||||
|
}
|
||||||
|
|
||||||
|
void stop()
|
||||||
|
{
|
||||||
|
writeln(location ~ " garage Door is Stopped");
|
||||||
|
}
|
||||||
|
|
||||||
|
void lightOn()
|
||||||
|
{
|
||||||
|
writeln(location ~ " garage light is on");
|
||||||
|
}
|
||||||
|
|
||||||
|
void lightOff()
|
||||||
|
{
|
||||||
|
writeln(location ~ " garage light is off");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
module command.remoteundostatus.garagedoordowncommand;
|
||||||
|
|
||||||
|
import command.remoteundostatus.command;
|
||||||
|
import command.remoteundostatus.garagedoor;
|
||||||
|
|
||||||
|
class GarageDoorDownCommand : Command
|
||||||
|
{
|
||||||
|
GarageDoor garageDoor;
|
||||||
|
|
||||||
|
this(GarageDoor garageDoor)
|
||||||
|
{
|
||||||
|
this.garageDoor = garageDoor;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
garageDoor.down();
|
||||||
|
}
|
||||||
|
|
||||||
|
void undo()
|
||||||
|
{
|
||||||
|
garageDoor.up();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
module command.remoteundostatus.garagedoorupcommand;
|
||||||
|
|
||||||
|
import command.remoteundostatus.command;
|
||||||
|
import command.remoteundostatus.garagedoor;
|
||||||
|
|
||||||
|
class GarageDoorUpCommand : Command
|
||||||
|
{
|
||||||
|
GarageDoor garageDoor;
|
||||||
|
|
||||||
|
this(GarageDoor garageDoor)
|
||||||
|
{
|
||||||
|
this.garageDoor = garageDoor;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
garageDoor.up();
|
||||||
|
}
|
||||||
|
|
||||||
|
void undo()
|
||||||
|
{
|
||||||
|
garageDoor.down();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
module command.remoteundostatus.light;
|
||||||
|
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
class Light
|
||||||
|
{
|
||||||
|
private string location;
|
||||||
|
|
||||||
|
this(string location)
|
||||||
|
{
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
void on()
|
||||||
|
{
|
||||||
|
writeln(location ~ " light is On");
|
||||||
|
}
|
||||||
|
|
||||||
|
void off()
|
||||||
|
{
|
||||||
|
writeln(location ~ " light is Off");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
module command.remoteundostatus.lightoffcommand;
|
||||||
|
|
||||||
|
import command.remoteundostatus.command;
|
||||||
|
import command.remoteundostatus.light;
|
||||||
|
|
||||||
|
class LightOffCommand : Command
|
||||||
|
{
|
||||||
|
Light light;
|
||||||
|
|
||||||
|
this(Light light)
|
||||||
|
{
|
||||||
|
this.light = light;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
light.off();
|
||||||
|
}
|
||||||
|
|
||||||
|
void undo()
|
||||||
|
{
|
||||||
|
light.on();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
module command.remoteundostatus.lightoncommand;
|
||||||
|
|
||||||
|
import command.remoteundostatus.command;
|
||||||
|
import command.remoteundostatus.light;
|
||||||
|
|
||||||
|
class LightOnCommand : Command
|
||||||
|
{
|
||||||
|
Light light;
|
||||||
|
|
||||||
|
this(Light light)
|
||||||
|
{
|
||||||
|
this.light = light;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute()
|
||||||
|
{
|
||||||
|
light.on();
|
||||||
|
}
|
||||||
|
|
||||||
|
void undo()
|
||||||
|
{
|
||||||
|
light.off();
|
||||||
|
}
|
||||||
|
}
|