Java 策略模式

 

理解策略模式

举个例子:

我们去海南游玩,出行的方式有很多种,比如我们坐 火车高铁飞机游船等等。但是不管我们使用哪一种出行方式,咱们的最终目的就是去三亚游玩  (归纳起来也就是,选择不同的方式产生的结果都是一样的。)

 

 

策略模式的优缺点

优点

  • 策略模式遵循开闭原则,实现代码的解耦合,扩展新的方法,只需要继承策略接口。

缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

  • 会出现很多策略类

 

实现策略模式

由上可知 策略模式把 对象(咱们)本身 和 出行方式选择 区分开来,因此 咱们将整个模式分解为 三部分

  1. 环境类(Context):用来操作策略的上下文环境,也就是咱们。

  2. 抽象策略类(Strategy):策略的抽象,出行方式的抽象

  3. 具体策略类(ConcreteStrategy):具体的策略实现,也就是每一种 出行方式的具体实现。

     

1、定义抽象策略接口

/**
 * 出行策略接口
 * @author oukele
 */
public interface TravelStrategy {

    /**
     * 抽象的出行方式
     */
    void useFunction();

}

2、具体策略类

1、火车
/**
 * 火车出行方式的具体实现类
 * @author oukele
 */
public class Train implements TravelStrategy {

    @Override
    public void useFunction() {
        System.out.println("乘坐火车去三亚....");
    }

}

2、飞机
/**
 * 飞机出行方式的具体实现类
 * @author oukele
 */
public class Aircraft implements TravelStrategy {

    @Override
    public void useFunction() {
        System.out.println("乘坐飞机去三亚....");
    }

}

3、高铁
/**
 * 高铁出行方式的具体实现类
 * @author oukele
 */
public class HighSpeedTrains implements TravelStrategy {

    @Override
    public void useFunction() {
        System.out.println("乘坐高铁去三亚....");
    }

}

3、环境类

public class Myself {

    private  TravelStrategy travelStrategy;

    /**
     * 设置 游客出行的方式
     * @param travelStrategy 出行方式接口的具体实现类
     */
    public void setTravelFunction(TravelStrategy travelStrategy){
        this.travelStrategy = travelStrategy;
    }

    /**
     * 显示当前游客是以什么方式出行的
     */
    public void travelFunction(){
        travelStrategy.useFunction();
    }

    public static void main(String[] args) {
        // new出一个游客
        Myself myself = new Myself();
        // 选择的出行方式
        //1. 火车
        //myself.setTravelFunction(new Train());
        //2. 飞机
        myself.setTravelFunction(new Aircraft());
        //3. 高铁
        //myself.setTravelFunction(new HighSpeedTrains());
        // 显示当前选择出行的方式
        myself.travelFunction();
    }

} 

由于 这里选择了 飞机的出行方式,所以它的结果为:

乘坐飞机去三亚....

posted @ 2019-04-09 18:02  追梦滴小蜗牛  阅读(397)  评论(0编辑  收藏  举报