• 设计模式 之 策略(Strategy)模式


    最近看了《head first 设计模式》一书,便总结了里面的一些内容,今天就简单介绍一下策略模式。

    策略模式:定义了算法族,分别封装起来,让他们能够相互替换,此模式让算法的变化独立于使用算法的客户。简单来说,就是将各个算法分别封装起来,使得他们能够互换。

    下面是策略模式的示例结构图:

    策略模式涉及三个角色:

    • 环境类(context):用一个ConcreteStrategy对象来配置。持有Strategy的引用。
    • 抽象策略类(Strategy):定义了所有算法的公共接口。
    • 具体策略类(ConcreteStrategy):定义了每一个算法,每个算法实现了同一个接口

    源代码:

    抽象策略类:

    public interface Strategy {
        /**
         * 策略方法
         */
        public void strategyInterface();
    }

    具体策略类:

    public class ConcreteStrategyA implements Strategy {
    
        @Override
        public void strategyInterface() {
            //相关的业务
        }
    
    }
    public class ConcreteStrategyB implements Strategy {
    
        @Override
        public void strategyInterface() {
            //相关的业务
        }
    
    }

    对象类:

    public class Context {
        //持有一个具体策略的对象
        private Strategy strategy;
        /**
         * 构造函数,传入一个具体策略对象
         * @param strategy    具体策略对象
         */
        public Context(Strategy strategy){
            this.strategy = strategy;
        }
        /**
         * 策略方法
         */
        public void contextInterface(){
            
            strategy.strategyInterface();
        }
        
    }

    应用场景举例:

    抽象策略类:

    /**
     * @author haifei
     *    抽象策略类
     */
    public interface FlyBehavior {
        public void fly();
    }

    具体策略类:

    ConcreteStrategyA:

    public class FlyNoWay implements FlyBehavior{
    
        @Override
        public void fly() {
            System.out.print("不会飞行");
        }
    
    }

    ConcreteStrategyB:

    public class FlyWithWings implements FlyBehavior{
    
        @Override
        public void fly() {
            System.out.print("用翅膀飞行");
        }
    
    }

    环境类:

    public class DuckSpecial {
        FlyBehavior flyBehavior;
        
        public DuckSpecial(FlyBehavior flyBehavior){
            this.flyBehavior = flyBehavior;
        }
        
        public void fly(){
            flyBehavior.fly();
        }
    }

    客户端:

    public class DuckSpecialTest {
        
        public static void  main(String[] args) {
            //根据需要选择算法
            FlyBehavior fly = new FlyWithWings();
            DuckSpecial duck = new DuckSpecial(fly);
            duck.fly();
        }
    }

    运行结果:

    用翅膀飞行
  • 相关阅读:
    delphi 常用的将窗口置前的函数
    delphi中Message消息的使用方法
    批处理 删除文件
    CDR话单主要字段介绍
    集成学习算法总结----Boosting和Bagging
    Benchmark简介
    脚本中export不起作用的原因分析
    RAID详解[RAID0/RAID1/RAID10/RAID5]
    基于DPI(深度报文解析)的应用识别
    DPI (Deep Packet Inspection) 深度包检测技术
  • 原文地址:https://www.cnblogs.com/mercuryli/p/5276467.html
Copyright © 2020-2023  润新知