Рубрики

Шаблон стратегии | Набор 2 (реализация)

Мы обсудили пример истребителя и представили шаблон стратегии в наборе 1.

Шаблон стратегии | Комплект 1 (Введение)

В этом посте мы применяем шаблон стратегии к проблеме бойца и обсуждаем реализацию.

Первым шагом является выявление поведения, которое может измениться в разных классах в будущем, и отделение его от остальных. Для нашего примера, пусть они будут пнуть и прыгать. Чтобы отделить эти поведения, мы вытащим оба метода из класса Fighter и создадим новый набор классов для представления каждого поведения.

Класс Fighter теперь будет делегировать свое поведение удара и прыжка вместо использования методов удара и прыжка, определенных в классе Fighter или его подклассе.

После доработки окончательная диаграмма классов будет (Нажмите на изображение для лучшего просмотра):

Сравнивая наш дизайн с определением инкапсулированного поведения стратегии и паттернов, мы получаем два семейства алгоритмов. И эти алгоритмы являются взаимозаменяемыми, что очевидно при реализации.

Ниже приведена реализация Java того же.

// Java-программа для демонстрации реализации
// Стратегия

  
// Аннотация, поскольку у вас должен быть конкретный боец

abstract class Fighter

{

    KickBehavior kickBehavior;

    JumpBehavior jumpBehavior;

  

    public Fighter(KickBehavior kickBehavior,

                   JumpBehavior jumpBehavior)

    {

        this.jumpBehavior = jumpBehavior;

        this.kickBehavior = kickBehavior;

    }

    public void punch()

    {

        System.out.println("Default Punch");

    }

    public void kick()

    {

        // делегировать поведение пинка

        kickBehavior.kick();

    }

    public void jump()

    {

  

        // делегировать поведение прыжка

        jumpBehavior.jump();

    }

    public void roll()

    {

        System.out.println("Default Roll");

    }

    public void setKickBehavior(KickBehavior kickBehavior)

    {

        this.kickBehavior = kickBehavior;

    }

    public void setJumpBehavior(JumpBehavior jumpBehavior)

    {

        this.jumpBehavior = jumpBehavior;

    }

    public abstract void display();

}

  
// Инкапсулированное поведение удара

interface KickBehavior

{

    public void kick();

}

class LightningKick implements KickBehavior

{

    public void kick()

    {

        System.out.println("Lightning Kick");

    }

}

class TornadoKick implements KickBehavior

{

    public void kick()

    {

        System.out.println("Tornado Kick");

    }

}

  
// Инкапсулированное поведение прыжка

interface JumpBehavior

{

    public void jump();

}

class ShortJump implements JumpBehavior

{

    public void jump()

    {

        System.out.println("Short Jump");

    }

}

class LongJump implements JumpBehavior

{

    public void jump()

    {

        System.out.println("Long Jump");

    }

}

  
// Персонажи

class Ryu extends Fighter

{

    public Ryu(KickBehavior kickBehavior,

               JumpBehavior jumpBehavior)

    {

        super(kickBehavior,jumpBehavior);

    }

    public void display()

    {

        System.out.println("Ryu");

    }

}

class Ken extends Fighter

{

    public Ken(KickBehavior kickBehavior,

               JumpBehavior jumpBehavior)

    {

        super(kickBehavior,jumpBehavior);

    }

    public void display()

    {

        System.out.println("Ken");

    }

}

class ChunLi extends Fighter

{

    public ChunLi(KickBehavior kickBehavior,

                  JumpBehavior jumpBehavior)

    {

        super(kickBehavior,jumpBehavior);

    }

    public void display()

    {

        System.out.println("ChunLi");

    }

}

  
// Класс водителя

class StreetFighter

{

    public static void main(String args[])

    {

        // давайте сначала сделаем несколько вариантов поведения

        JumpBehavior shortJump = new ShortJump();

        JumpBehavior LongJump = new LongJump();

        KickBehavior tornadoKick = new TornadoKick();

  

        // Сделать бойца с желаемым поведением

        Fighter ken = new Ken(tornadoKick,shortJump);

        ken.display();

  

        // Тест поведения

        ken.punch();

        ken.kick();

        ken.jump();

  

        // Изменяем поведение динамически (алгоритмы

        // взаимозаменяемо)

        ken.setJumpBehavior(LongJump);

        ken.jump();

    }

}

Выход :

Ken
Default Punch
Tornado Kick
Short Jump
Long Jump

Ссылки:
Head First Design Patterns

Эта статья предоставлена Сулабх Кумар . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Шаблон стратегии | Набор 2 (реализация)

0.00 (0%) 0 votes