2015-12-13 3 views
0

Я только что узнал, что представляет собой шаблон стратегии из Интернета. Но я подумал, как это может улучшить мой код. Например, у меня есть следующие коды, найденные в Интернете, как это. Это суперкласс по имени животные:Почему мы используем шаблон стратегии?

abstract public class Animal { 
    private String name; 
    private int weight; 
    private String sound; 

    public void setName(String name){ 
     this.name = name; 
    } 

    public String getName(){ 
     return name; 
    } 

    public void setWeight(int weight){ 
     if(weight > 0){ 
      this.weight = weight; 
     }else { 
      System.out.println("Weight must be bigger than 0"); 
     } 
    } 

    public int getWeight(){ 
     return weight; 
    } 

    public void setSound(String sound){ 
     this.sound = sound; 
    } 
    public String getSound(){ 
     return sound; 
    } 

    public void specialMethod(){ 
     System.out.println("Ok"); 
    } 
} 

Это подкласс имени собака:

public class Dog extends Animal { 
    public void digHole(){ 
     System.out.println("Dig a hole"); 
    } 

    public Dog(){ 
     super(); 
     setSound("bark"); 
    } 

    public void testSuper(Animal obj){ 
     System.out.println(obj.getName()); 
    } 
} 

В учебнике, он сказал, что если мы хотим, чтобы добавить летающие способности, так что я могу проверить, является ли собака может летать или нет. Добавление кода прямо так же плохо, как показано в приведенном ниже коде.

суперкласс животные с добавленным летающим методом способности

abstract public class Animal { 
    private String name; 
    private int weight; 
    private String sound; 

    // Add fly method to the superclass which is a bad idea 
    public String fly(){ 
     return " I am flying "; 
    } 

    public void setName(String name){ 
     this.name = name; 
    } 

    public String getName(){ 
     return name; 
    } 

    public void setWeight(int weight){ 
     if(weight > 0){ 
      this.weight = weight; 
     }else { 
      System.out.println("Weight must be bigger than 0"); 
     } 
    } 

    public int getWeight(){ 
     return weight; 
    } 

    public void setSound(String sound){ 
     this.sound = sound; 
    } 

    public String getSound(){ 
     return sound; 
    } 

    public void specialMethod(){ 
     System.out.println("Ok"); 
    } 
} 

Используя шаблон стратегии, мы можем создать интерфейс с именем Flys с методом лета, позволяя любой подкласс реализовать метод, таким образом, как показано в руководстве Я создал интерфейс с именем Flys с 2 подклассов реализации интерфейса:

public interface Flys { 
    String fly(); 
} 

class ItFlys implements Flys{ 
    public String fly(){ 
     return "Flying high"; 
    } 
} 

class CantFly implements Flys{ 
    public String fly(){ 
     return "I can't fly"; 
    } 
} 

После того, как я сделал интерфейс, я могу рефакторинг класса Animal,

abstract public class Animal { 
    private String name; 
    private int weight; 
    private String sound; 
    Flys flyingType; // Add an object of the interface to the superclass 

    public String tryToFly(){ // add a new method tryToFly 
     return flyingType.fly(); 
    } 

    // Adding another method named setFlyingAbility 
    public void setFlyingAbility(Flys newFlyType){ 
     flyingType = newFlyType; 
    } 

    public void setName(String name){ 
     this.name = name; 
    } 

    public String getName(){ 
     return name; 
    } 

    public void setWeight(int weight){ 
     if(weight > 0){ 
      this.weight = weight; 
     }else { 
      System.out.println("Weight must be bigger than 0"); 
     } 
    } 

    public int getWeight(){ 
     return weight; 
    } 

    public void setSound(String sound){ 
     this.sound = sound; 
    } 

    public String getSound(){ 
     return sound; 
    } 

    public void specialMethod(){ 
     System.out.println("Ok"); 
    } 
} 

Теперь в моей собаке подклассе, я просто добавить еще один код

public class Dog extends Animal { 
    public Dog(){ 
     super(); 
     setSound("bark"); 
     flyingType = new CantFly(); // I set flyingType object 
    } 

    public void digHole(){ 
     System.out.println("Dig a hole"); 
    } 

    public void testSuper(Animal obj){ 
     System.out.println(obj.getName()); 
    } 
} 

Окончательный класс, где я могу выполнить все коды, проверяя, может ли мой класс собак летать или нет.

public class AnimalPlay { 
    public static void main(String args[]){ 
     Animal sparky = new Dog(); 
     Animal tweety = new Bird(); 
     System.out.println("Dog " + sparky.tryToFly()); // the result is I can't fly 
     System.out.println("Bird " + tweety.tryToFly()); // the result is I am flying 
     sparky.setFlyingAbility(new ItFlys()); 
     System.out.println("Dog " + sparky.tryToFly()); // the result is I am flying 
    } 
} 

Мой вопрос, что если я еще добавить муху() метод традиционным способом, это дает тот же результат, не так ли?

Добавление метода fly() в суперкласс, чтобы я мог переопределить метод fly() в классе Dog, но это не очень хорошая идея.

abstract public class Animal { 
    private String name; 
    private int weight; 
    private String sound; 

    // Add fly method to the superclass which is a bad idea 
    public String fly(){ 
     return " I am flying "; 
    } 

    public void setName(String name){ 
     this.name = name; 
    } 

    public String getName(){ 
     return name; 
    } 

    public void setWeight(int weight){ 
     if(weight > 0){ 
      this.weight = weight; 
     }else { 
      System.out.println("Weight must be bigger than 0"); 
     } 
    } 

    public int getWeight(){ 
     return weight; 
    } 

    public void setSound(String sound){ 
     this.sound = sound; 
    } 
    public String getSound(){ 
     return sound; 
    } 

    public void specialMethod(){ 
     System.out.println("Ok"); 
    } 
} 
+1

Шаблон стратегии - классический случай «предпочитают композицию над наследованием». Вместо того, чтобы модифицировать код во время компиляции (жестко кодировать поведение в метод 'fly()'), ссылайтесь на поведение от переменной. Таким образом, во время выполнения вы можете изменить переменную. Добавьте DI в микс, и вам не нужно будет модифицировать класс 'Dog' вообще, чтобы изменить его поведение (просто установите его, передав его конструктору' Dog' или методу 'setFly' –

+0

, это вещь собаки CAN вы можете применить различные стратегии, чтобы научить Sparky: boardAPlane, jumpOnTrampoline ... Вместо того, чтобы жестко кодировать поведение «не может летать» в классе Dog, пользователи вашего класса могут указать, КАК заставить собаку летать –

+0

Нет такой как «шаблон стратегии Java». Существует шаблон стратегии. Исправлено ваше странное форматирование. – EJP

ответ

0

Я не уверен, пришли первый, но шаблон стратегии, как и любой другой модель поведения является конкретным экземпляром open close principle. В общем, вы хотите изменить поведение объекта, не изменяя его код. Это имеет глубокие последствия с точки зрения расширяемости, ремонтопригодности и согласованности.

+0

OCP был опубликован в 1988 году. Шаблоны дизайна GoF были опубликованы в 1994 году. – jaco0646

+0

Так что, я думаю, что «доказывает» образец является истинным экземпляром большей концепции. – ThePolisher

2

Мой вопрос: а что если я все-таки добавлю метод fly() традиционным способом, он даст тот же результат, не так ли?

Ответ «НЕТ».

  1. Стратегический шаблон позволяет перемещать поведение в отдельный класс, что хорошо по принципу SOLID «S» - единственная ответственность. Изображение, что вам нужно научить робота или человека «лаять» - вам не нужно заставлять их наследовать базовый класс животных. И вам также не нужно внедрять лай в каждом классе.
  2. Наличие всех свойств в базовом классе также не так хорошо, как против замены SOLID 'L' - Liskou. Что делать, если обезьяне не нужно лаять, которая реализуется в базовом классе животных?
  3. Стратегический шаблон позволяет вам разработать код, соответствующий SOLID 'I' - сегрегация интерфейса - просто сделайте интерфейс IAnimalAction, чтобы сделать много реализаций лая и присвоить свойство IAnimalAction желаемым классам животных (как свойство или как еще один интерфейс для реализации)
  4. стратегия также помогает с SOLID «D» - вы можете придать желаемую стратегию животных (лай, летающий), не каждое животное даже знать об этом

Мы можем продолжать и другие бонусы. Но вы можете посмотреть фото

Удачи вам!

Смежные вопросы