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();
        }
    }

    运行结果:

    用翅膀飞行
  • 相关阅读:
    NodeJS实例系列~环境搭建,Hello world归来!
    Node.js教程系列~目录
    poj 1743 男人八题之后缀数组求最长不可重叠最长重复子串
    利用手工编码的方式对srtus2进行输入验证
    介绍linux下Source Insight强大代码编辑器sublime_text_3
    【机器学习】支持向量机[续1]
    boost库在工作(33)网络服务端之三
    HNCU1099:堆积木
    HNCU1100:彩票
    Lua获取网络时间
  • 原文地址:https://www.cnblogs.com/mercuryli/p/5276467.html
Copyright © 2011-2022 走看看