Я только что узнал, что представляет собой шаблон стратегии из Интернета. Но я подумал, как это может улучшить мой код. Например, у меня есть следующие коды, найденные в Интернете, как это. Это суперкласс по имени животные:Почему мы используем шаблон стратегии?
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");
}
}
Шаблон стратегии - классический случай «предпочитают композицию над наследованием». Вместо того, чтобы модифицировать код во время компиляции (жестко кодировать поведение в метод 'fly()'), ссылайтесь на поведение от переменной. Таким образом, во время выполнения вы можете изменить переменную. Добавьте DI в микс, и вам не нужно будет модифицировать класс 'Dog' вообще, чтобы изменить его поведение (просто установите его, передав его конструктору' Dog' или методу 'setFly' –
, это вещь собаки CAN вы можете применить различные стратегии, чтобы научить Sparky: boardAPlane, jumpOnTrampoline ... Вместо того, чтобы жестко кодировать поведение «не может летать» в классе Dog, пользователи вашего класса могут указать, КАК заставить собаку летать –
Нет такой как «шаблон стратегии Java». Существует шаблон стратегии. Исправлено ваше странное форматирование. – EJP