zoukankan      html  css  js  c++  java
  • 设计模式 之 策略(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();
        }
    }

    运行结果:

    用翅膀飞行
  • 相关阅读:
    [HTML] IE=edge,chrome=1的META标签详解
    [FFmpeg] ffmpeg 常用命令
    rsyncd 配置使用
    httpd配置
    ftp利用脚本添加本地用户
    zabbix监控概念
    搭建本地yum源并定时同步
    linux添加lvm磁盘大小,命令行创建swap
    500 OOPS: vsftpd: refusing to run with writable root inside chroot()
    利用saltstack批量安装clamav杀毒软件
  • 原文地址:https://www.cnblogs.com/mercuryli/p/5276467.html
Copyright © 2011-2022 走看看