• 策略模式(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();
        }
    }
    

    输出:

    乘飞机去旅行,飞机策略
    
    自驾游,自驾策略
    
    徒步旅行,徒步策略。
    
  • 相关阅读:
    Android学习笔记之-----讯飞语音识别实例化RecognizerDialog参数出现错误的解决方法
    java基本数据类型取值范围
    中国教育
    git push --help
    cherry Tree的严重漏洞
    程序的核心是什么
    BeanUtils.getProperty性能分析
    Java各种反射性能对比
    Spring AOP无法拦截Controller中的方法
    Mock单元测试
  • 原文地址:https://www.cnblogs.com/fanglongxiang/p/13233311.html
Copyright © 2020-2023  润新知