设计模式1 - 策略模式

定义
策略模式 定义了一系列算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

组成
抽象策略角色:策略类,通常由一个接口或者抽象类实现。
具体策略角色:封装了相关的算法和行为。
环境角色:持有一个策略类的引用,最终给客户端调用。

适用场景
1、多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2、需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3、对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

例子

策略接口类(FlyBehavior.java):
public interface FlyBehavior {
    void fly();
}
具体策略实现类(FlyFast.java FlySlowly.java):
public class FlyFast implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("fly fast ...");
    }
}

public class FlySlowly implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("fly slowly ...");
    }
}
环境调用类(Duck.java):
public class Duck {
    private FlyBehavior flyBehavior;

    public Duck(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public void fly(){
        this.flyBehavior.fly();
    }

    public static void main(String[] args) {
        new Duck(new FlyFast()).fly();
        new Duck(new FlySlowly()).fly();
    }
}

这里可能会有疑问,我使用继承来实现,比如我把Duck类变为abstract,然后把fly()修改为abstract,由子类去继承Duck,各自实现自己的fly(),这样就会导致无法复用代码,假如两个子类的fly()行为一样也都得自己实现;或者假如在父类Duck里有默认的fly()的实现逻辑,可也只能默认实现一种,而且以后改变就会导致其他子类的错误行为;同时我们也无法知道fly()的所有实现。所以在面临需要复用多种不同策略的代码时,该模式是很有用的。