策略模式(Strategy)

什么时策略模式

该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。
比如,旅游时,可以选择飞机、火车、公共汽车、骑行、步行或者开车等不同的方式,每种方式都是一种策略。

注:策略模式也是一种行为型模式。

策略模式优缺点

优点

  1. 避免使用多重条件判断。
  2. 提供一系列算法,可以自由选择切换。
  3. 扩展方便,可以不修改原代码基础上新增新的算法。
  4. 策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。

缺点

  1. 策略类增多
  2. 所有策略算法需暴露客户,以便客户选择。

策略模式结构

策略模式是准备一组算法,并将这组算法封装到一系列的策略类里面,作为一个抽象策略类的子类。策略模式的重心不是如何实现算法,而是如何组织这些算法,从而让程序结构更加灵活,具有更好的维护性和扩展性。

策略模式有以下几个结构:

  1. 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
  2. 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
  3. 环境(Context)类:持有一个策略类的引用,最终给客户端调用。

实列demo

抽象策略类:定义了旅行策略接口。

public interface TravelStrategy {
     void goTravel();
}

具体策略类:实现了旅行策略接口。这里分别是飞机旅行策略、骑行策略、自驾策略、徒步策略。
当新增一种策略时,只需添加一个类实现上述TravelStrategy接口即可。

public class AirplaneStrategy implements TravelStrategy {
    @Override
    public void goTravel() {
        System.out.println("乘飞机去旅行,飞机策略");	
    }
}

public class BicycleStrategy implements TravelStrategy {
    @Override
    public void goTravel() {
        System.out.println("骑行,骑行策略");	
    }
}

public class CarStrategy implements TravelStrategy {
    @Override
    public void goTravel() {
        System.out.println("自驾游,自驾策略");	
    }
}

public class FootStrategy implements TravelStrategy {
    @Override
    public void goTravel() {
        System.out.println("徒步旅行,徒步策略。");	
    }
}

环境类:提供客户调用。

public class Traveler {
    private TravelStrategy travelStrategy;

    public TravelStrategy getTravelStrategy() {
        return travelStrategy;
    }

    public void setTravelStrategy(TravelStrategy travelStrategy) {
        this.travelStrategy = travelStrategy;
    }
    
    public void goTravel() {
        travelStrategy.goTravel();
    }
}

客户端调用:

public class StrategyTest {
    public static void main(String[] args) {
        Traveler traveler = new Traveler();
        
        traveler.setTravelStrategy(new AirplaneStrategy());
        traveler.goTravel();
        System.out.println();
        traveler.setTravelStrategy(new CarStrategy());
        traveler.goTravel();
        System.out.println();
        traveler.setTravelStrategy(new FootStrategy());
        traveler.goTravel();
        System.out.println();
    }
}

输出:

乘飞机去旅行,飞机策略

自驾游,自驾策略

徒步旅行,徒步策略。
posted @ 2020-07-04 01:40  流浪_归家  阅读(369)  评论(0编辑  收藏  举报