Описание:
Инкапсулируем поведенческие семейства алгоритмов в отдельные классы, реализующие общий интерфейс. Это позволяет изменять аспекты объекта во время выполнения программы.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class Main { public static void main(String[] args){ Hero hero = new Knight("Obi Wan"); hero.printName(); Knight knight = new Knight("Dart Sitius"); knight.printName(); hero.getWeapon().damage(knight); knight.printHealth(); hero.setWeapon(new Laser()); for (int i = 0; i < 4; i++){ hero.getWeapon().damage(knight); knight.printHealth(); } } } |
1 2 3 4 5 6 7 |
My name is Obi Wan My name is Dart Sitius Dart Sitius health: 90% Dart Sitius health: 80% Dart Sitius health: 60% Dart Sitius health: 30% Dart Sitius is dead. |
Коды классов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
abstract class Hero { String name; int health; Weapon weapon; public Hero(String name){ health = 100; this.name = new String(name); } public void printName(){ System.out.println("My name is " + name); } public void printHealth(){ if (health != 0) { System.out.println(name + " health: " + health + "%"); }else{ System.out.println(name+" is dead."); } } public int getHealth() { return health; } public void setHealth(int health) { this.health = health; if (this.health < 0){ this.health = 0; } } public Weapon getWeapon() { return weapon; } public void setWeapon(Weapon weapon) { this.weapon = weapon; } } |
1 2 3 4 5 6 7 |
public class Knight extends Hero{ public Knight(String name) { super(name); setWeapon(new Sword()); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public class Laser implements Weapon{ private int power = 10; @Override public void damage(Hero hero) { hero.setHealth(hero.getHealth()-getWeaponPower()); power += 10; //увеличиваем мощность каждую секунду } @Override public int getWeaponPower() { return power; } } public class Sword implements Weapon { private int power = 10; @Override public void damage(Hero hero) { hero.setHealth(hero.getHealth()-getWeaponPower()); } @Override public int getWeaponPower() { return power; } } |
1 2 3 4 |
public interface Weapon { public void damage(Hero hero); public int getWeaponPower(); } |
UML-диаграмма:
Универсальный совет: отдавайте предпочтение интерфейсу, нежели абстрактному классу
Паттерн Стратегия