zoukankan      html  css  js  c++  java
  • 设计模式-策略模式(Strategy)

    策略模式是行为模式的一种,它对一系列算法加以封装,为所有算法定义一个抽象的算法接口。具体的算法选择由客户端决定。策略模式主要用来平滑的处理算法的切换。

    角色和职责:

    1.环境角色(Context)-Context

       持有Strategy的引用

    2.抽象策略(Strategy)-Strategy:

        这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口

    3.具体策略(Concrete Strategy)-Md5Strategy、RsaStrategy:

        包装了相关的算法或行为

    UML图:

    具体代码:

    /**
     * 抽象策略接口
     */
    public interface Strategy {
        void encrypt();//加密
    }
    /**
     * MD5加密
     */
    public class Md5Strategy implements Strategy{
        @Override
        public void encrypt() {
            System.out.println("进行MD5加密");
        }
    }
    /**
     * RSA加密
     */
    public class RsaStrategy implements Strategy{
        @Override
        public void encrypt() {
            System.out.println("进行RSA加密");
        }
    }
    /**
     * 算法的引用,客户端调用它来抉择具体的算法
     */
    public class Context {
        private Strategy strategy;
        public Context(Strategy strategy){
            this.strategy = strategy;
        }
    
        public void encrypt(){
            this.strategy.encrypt();
        }
    }
    public class Main {
        public static void main(String[] args) {
            Context contextMD5 = new Context(new Md5Strategy());//MD5加密
            contextMD5.encrypt();
    
            Context contextRSA = new Context(new RsaStrategy());//RSA加密
            contextRSA.encrypt();
        }
    }

    结果:

    进行MD5加密
    进行RSA加密

    优缺点:

    优:

    • 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复
    • 使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。

    缺:

    • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况
    • 由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观

     源码地址:https://github.com/qjm201000/design_pattern_strategy.git

  • 相关阅读:
    1、编写一个简单的C++程序
    96. Unique Binary Search Trees
    python 操作redis
    json.loads的一个很有意思的现象
    No changes detected
    leetcode 127 wordladder
    django uwsgi websocket踩坑
    you need to build uWSGI with SSL support to use the websocket handshake api function !!!
    pyinstaller 出现str error
    数据库的读现象
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10062662.html
Copyright © 2011-2022 走看看