天天看点

设计模式速记-策略模式

设计模式速记-策略模式

一、策略模式简介

1. 什么是策略模式

策略模式是一种对象行为型模式,策略模式定义:

策略模式针对于一组算法,旨在将这组算法的使用和实现分开。针对一系列具有共同目的的算法,用不同的类将每个算法封装起来,使用算法时通过策略类来进行选择。

所以,策略模式简而言之,就是将算法的实现与使用分割开来;使用时必须理解各个算法类的特点特性,通过统一的执行类来使用。

2. 策略模式的优缺点

策略模式的主要优点如下:

  • 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句。
  • 策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。
  • 策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。
  • 策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。
  • 策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。

策略模式的缺点如下:

  • 客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类。
  • 策略模式造成很多的策略类。

3. 策略模式举例

生活中可以见到很多涉及到策略模式的例子,如:

  • 选择出行方式;飞机、轮船、火车、汽车等都是一种策略。
  • 选择排序算法;针对不同的情况有不同的算法,冒泡、快排、希尔、堆排序等都各为一种策略;

二、策略模式示例

1. 策略模式涉及的角色

  1. 抽象策略接口:定义一个公共接口,让不同的算法类实现此接口;
  2. 具体抽象类:实现了抽象策略接口的类,提供算法的具体实现;
  3. 环境类:持有一个策略类的引用,最终交给使用方调用。

2.示例代码

示例代码为使用策略模式来选择出行方式:

  1. 抽象策略接口
    /**
     * @Description 抽象策略接口
     */
    public interface TravelMethod {
        void travel();
    }
    
               
  2. 具体抽象类
    /**
     * @Description 轮船出行策略类
     */
    public class ShipTravelMethod implements TravelMethod {
        @Override
        public void travel() {
            System.out.println("travel by ship");
        }
    }
    /**
     * @Description 飞机出行策略类
     */
    public class FlightTravelMethod implements TravelMethod {
        @Override
        public void travel() {
            System.out.println("travel by airplane");
        }
    }
    /**
     * @Description 汽车出行策略类
     */
    public class BusTravelMethod implements TravelMethod {
        @Override
        public void travel() {
            System.out.println("travel by bus");
        }
    }
               
  3. 环境类(负责具体策略执行)
    /**
     * @Description 环境类,有权限执行策略
     */
    public class Context {
        private TravelMethod travelMethod;
    
        public Context(TravelMethod travelMethod){
            this.travelMethod = travelMethod;
        }
    
        /**
         * 设置策略(出行方式)
         * @param travelMethod  出行方式策略类
         */
        public void setTravelMethod(TravelMethod travelMethod) {
            this.travelMethod = travelMethod;
        }
    
        /**
         * 执行策略
         */
        public void travel(){
            this.travelMethod.travel();
        }
    }
               
  4. 测试类客户端
    /**
     * @Description 策略模式测试
     */
    public class StrategyTest {
    
        @Test
        public void travelTest(){
            TravelMethod busTravelMethod = new BusTravelMethod();
            TravelMethod flightTravelMethod = new FlightTravelMethod();
            TravelMethod shipTravelMethod = new ShipTravelMethod();
    
            Context context = new Context(busTravelMethod);
            context.travel();
    
            context.setTravelMethod(flightTravelMethod);
            context.travel();
    
            context.setTravelMethod(shipTravelMethod);
            context.travel();
        }
    }
               
  5. 测试结果

    travel by bus

    travel by airplane

    travel by ship

三、参考文献

  • 菜鸟教程-策略模式
  • C语言中文网-策略模式
  • 百度百科-策略模式