zgq105 / blog

2 stars 0 forks source link

策略模式 #58

Open zgq105 opened 5 years ago

zgq105 commented 5 years ago

image

1. 什么是策略模式?有什么作用?

策略模式是指类的行为或者算法可以在运行时动态更改,属于行为型设计模式。主要解决的问题是在算法相似的情况下,减少if。。。else带来的复杂和难于维护问题。

2. 如何实现?

以旅行的出行方式为例,可以选择汽车出游、火车出游、飞机出游等,实现一个简单的策略模式。实现代码如下: //创建策略抽象

/**
 * Created by zgq on 2019/6/9 16:31
 */
public interface Strategy {
    void selectTravelMode();
}

//创建策略实现类

/**
 * Created by zgq on 2019/6/9 16:33
 */
public class Airplane implements Strategy {
    @Override
    public void selectTravelMode() {
        System.out.println("选择飞机出行");
    }
}
/**
 * Created by zgq on 2019/6/9 16:33
 */
public class Car implements Strategy {
    @Override
    public void selectTravelMode() {
        System.out.println("选择汽车出行");
    }
}
/**
 * Created by zgq on 2019/6/9 16:33
 */
public class Train implements Strategy {
    @Override
    public void selectTravelMode() {
        System.out.println("选择火车出行");
    }
}

//创建主体对象类(环境类)

/**
 * Created by zgq on 2019/6/9 16:35
 */
public class Tourist {
    private Strategy mStrategy;

    public Tourist(Strategy strategy){
        this.mStrategy=strategy;
    }

    public void selectTravelMode(){
        mStrategy.selectTravelMode();
    }
}

//使用策略模式

/**
 * Created by zgq on 2019/6/9 16:31
 */
public class StrategyModeTest {
    public static void test(){
        //创建策略
        Strategy airplane=new Airplane();
        Strategy car=new Car();
        Strategy train=new Train();

        //创建主体对象
        Tourist tourist=new Tourist(airplane);
        tourist.selectTravelMode();

        tourist=new Tourist(car);
        tourist.selectTravelMode();

        tourist=new Tourist(train);
        tourist.selectTravelMode();

    }
}

3. JDK或Android的应用举例

在jdk中,ThreadPoolExecutor中的四种拒绝策略使用了策略模式。在Android中,ListAdapter和TimeInterpolator中使用了策略模式。

4. 小结

策略模式主要解决动态替换算法的问题。 优点:

缺点:

状态模式和策略模式的对比: