Динамическое изменение поведения утки
305.00K
Категория: ПрограммированиеПрограммирование

PatternStrategia1

1.

Пруд «Утиный домик»
В пруду живут утки
разных видов, которые
умеют плавать и
крякать!
MallarDuck
ReadHedDuck
Display(),
Swim(),
Quack()

2.

. . .
. . .

3.

Внесение таких изменений
может оказать пагубное влияние
на другие классы!!
Я не летаю и не крякая, но!!
тоже хочу в пруд!!!!!
Не учи меня летать!
Я высоты боюсь!!

4.

5.

6.

Public class Duck {
public virtual void fly(){
}
public virtual void quack(){
}
public void swim(){
}
public abstract display(){
}}
Public abstract class RubberDuck
:
Duck {
Public override void display(){ // конкретная реализация}
Public override quack() {
Console.WriteLine(«Пищу!»);}
. . .
}

7.

8.

Public abstract class Duck
. . .
public abstract display(){
}
}
Interface Flyabel {
}
{
Public class RubberDuck
Duck, Flyabel {
}
:

9.

Принцип проектирования:
1
Выделяйте переменные аспекты поведения и
отделите их от тех, которые не изменяются!!
Инкапсулируйте то, что изменяется, чтобы эти
аспекты не влияли на работу остального кода!!
2
Программируйте на уровне интерфейсов

10.

Fox f = new Fox();
f.gav();
Animal animal = new Fox();
animal.makeSound();
a = getAnimal();
a.makeSound();

11.

12.

Public class Duck{
QuackBehavior quackBehavior; -- каждый объект содержит ссылку
на реализацию интерфейса QuackBehavior
//…
Public void performQuack() {
quackBehavior.quack();
}
}
-- объект Duck делегирует поведение объекту,
на который ссылается quackBehavior

13.

public class MallardDuck : Duck
класс MallardDuck унаследовал поля
quackBehavior и flyBehavior от Duck
{
public MallardDuck()
{
quackBehavior = new Quack();
-- MallardDuck использует класс Quack для
выполнения действия, так что при вызове
performQuack() ответственность за
выполнение возлагается на объект Quack
flyBehavior = new FlyWithWings(); -- в качестве реализации интерфейса
FlyBehavior используется тип FlyWithWings
}
public override void display()
{
Console.WriteLine("Визуализация обычной утки кряквы");
}

14. Динамическое изменение поведения утки

Public void setFlyBehavior( FlyBehavior fb ) {
flyBehavior = bf;
}
Public void setQuackBehavior( QuackBehavior qb ) {
quackBehavior = qf;
}
public class MallardDuck : Duck {
public MallardDuck();
{
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
...
}

15.

public class MiniDuckSimulator {
public static void Main(string[] args)
{
Duck mallardDuck = new MallardDuck();
mallardDuck.performQuack();
mallardDuck.performFly();
Duck modelDuck = new ModelDuck();
modelDuck.performQuack();
modelDuck.performFly();
modelDuck.setQuackBehavior(new QuaCK());
modelDuck.setFliBehavior(new FlyRocketPowered());
modelDuck.performQuack();
modelDuck.performFly();
Console.ReadLine();
}
}

16.

17.

Принцип:
Отдавайте предпочтение композиции перед
наследованием!
Паттерн СТРАТЕГИЯ определяет семейство
алгоритмов, инкапсулирует каждый из них и
обеспечивает их взаимозаменяемость. Он позволяет
модифицировать алгоритмы независимо от их
использования на стороне клиента.
English     Русский Правила