Similar presentations:
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.
Принцип:Отдавайте предпочтение композиции перед
наследованием!
Паттерн СТРАТЕГИЯ определяет семейство
алгоритмов, инкапсулирует каждый из них и
обеспечивает их взаимозаменяемость. Он позволяет
модифицировать алгоритмы независимо от их
использования на стороне клиента.