Страницы

16 августа 2012 г.

Паттерн Strategy (Стратегия), Policy

Продолжая тему паттернов хотелось бы рассказать о Стратегии. Этот паттерн проектирования известен также под названием Policy. Суть его состоит в том, чтобы создать несколько моделей поведения (стратегий) для одного объекта и вынести их в отдельные классы. Вот ряд преимуществ данного паттерна:

  • позволяет выбирать модель поведения объекта динамически;
  • упрощает процесс добавления новых стратегий;
  • является альтернативой наследованию;
  • избавляет от множества условий (if, case);
  • делает еще много всего.
Если вам понятно, что значит каждый из этих пунктов (особенно 5-ый), переходите сразу к примеру на Java. А мы пока рассмотрим эти пункты немного подробнее.

Инкапсулирование стратегии в отдельном классе позволяет менять поведение объекта динамически. Очевидно, что для добавления новой стратегии нужно создать независимый класс и реализовать необходимые функции. Аналогично, для изменения или удаления стратегии опять же будет затронут только один класс.

Для выбора модели поведения часто используют наследование. Имея некоторый объект, мы создаем новый экземпляр подкласса этого объекта и присваиваем его самому объекту. При использовании паттерна Startegy, достаточно переключится на интересующую нас стратегию.

Если поведение объекта описывается несколькими методами, паттерн Strategy уменьшит кол-во условий в коде программы. Условный оператор понадобится нам не более одного раза для выбора определенной стратегии.

Использовать паттерн Strategy на практике можно, например, при выборе алгоритма шифрования:
public interface Algorithm {
  String crypt(String text, String key);
}

public class DESAlgorithm implements Algorithm {
  public String crypt(String text, String key) {
    String cryptedString = null;
    // тело алгоритма
    return cryptedString;
  }
}

public class RSAAlgorythm implements Algorythm {
  public String crypt(String text, String key) {
    String cryptedString = null;
    // тело алгоритма
    return cryptedString;
  }
}

public class Encryption {
  private Algorithm algorithm;

  public Encryption(Algorithm algorithm) {
    this.algorithm = algorithm;
  }

  public setAlgorithm(Algorithm algorithm) {
    this.algorithm = algorithm;
  }

  public crypt(String text, String key) {
    return algorithm.crypt(text, key);
  }
}

public class Test {
  public static void main(String[] args) {
    String key = “key”;
    String text = “text”;
    int alg = 1;
    Encryption encryption = new Encryption(new DESAlgorithm());
    String cryptedText = encryption.crypt(text, key);
  }
}
Далее, если нам в некотором участке кода понадобится поменять стратегию криптования, допустим по какому-то условию, можно сделать следующее:
  ...
  boolean needToChange = true;
  ...
  if (needToChange)
    encryption.setAlgorithm(new RSAAlgorithm());
  ...
Ну вот и все.
Паттерн Стратегия часто используется вместе с другими паттернами проектирования. Но и сам по себе он будет достаточно полезен в большом количестве случаев. В моей не большой практики я использовал его для GUI.

Комментариев нет:

Отправить комментарий