博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-策略模式(Strategy)
阅读量:5156 次
发布时间:2019-06-13

本文共 1563 字,大约阅读时间需要 5 分钟。

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

角色和职责:

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

转载于:https://www.cnblogs.com/qjm201000/p/10062662.html

你可能感兴趣的文章
Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍
查看>>
.Net 转战 Android 4.4 日常笔记目录
查看>>
IntelliJ IDEA 开发swing(二)
查看>>
十五天精通WCF——第十二天 说说wcf中的那几种序列化
查看>>
【.net深呼吸】动态类型(高级篇)
查看>>
javascript运算符整理
查看>>
消除类游戏(js版)
查看>>
【javascript基础】5、创建对象
查看>>
跟我一起学习ASP.NET 4.5 MVC4.0(六)
查看>>
IBM RSA (IBM rational software architect ) V8 学习之六 C++类模板设计
查看>>
SQL SERVER 2008 EXPRESS版本远程连接(tcp/ip)
查看>>
asp.net开源CMS推荐
查看>>
查询数据库里有多少张表、视图、存储过程
查看>>
Python和qqbot库开发简单的机器人
查看>>
Smarty foreach添加论坛楼层计数(counter)
查看>>
BOM之history对象(转)
查看>>
maven项目正常运行,项目图标打红叉叉解决方法(个人笔记)
查看>>
软件工程(2018)第二次团队作业
查看>>
GoLang执行需要输入密码的命令
查看>>
一款古老的 Scheme 编译器,一台古老的“机器”
查看>>