锈才学设计模式之  —— 策略模式

策略模式:把功能提供者单独封装成类,使它们可以互相替换使用,让功能提供者独立于使用者(调用者).

说明:

在面向对象编程中,我们尽量将功能(类)设计成复用,以符合OO思想。往往在开始都喜欢用继承来实现类的重用,当子类继承父类时,就可以重用父类的公共属性和方法。比如:

这种继承的方法,将使子类的方法都由父类继承而来,此例中,各种方式的加密子类继承父类的加密、解密方法,对于一种加密方式时可以满足,但是如果需要多种加密方法时就无法满足,就有很大的局限性,不具备足够的弹性,比如此图中的类别,当[报文加密]使用MD5算法,[Excel加密] 使用SHA算法时,往往就不能满足调用者的要求。此时就需要将功能提供方单独封装成类,独立于调用方,通过互相替换,达到各个功能的调用。比如:

在这图例中,在算法父类“有一个”算法的接口,将具体的算法都委托给它代为处理,并提供set、get方法。这样,子类的具体算法就不是继承父类而来,而是和适合的算法组合而来。这种组合建立的模型非常有弹性,更特别的是可以在运行时动态改变算法(行为),只要组合的对象符合父类算法的接口标准就可以。这种模式设计后,如果扩展一个[XML加密]类,它使用DES算法,则非常简单,增加[XML加密类],继承[加解密算法]父类,新增一个[DES算法类],实现算法接口,然后就可以在XML加密类中动态指定DES算法了。

示例代码:
    == 加解密算法父类 ==

package com.jody.pattern.strategy;
/*** 功能/模块:策略模式* 类描述:加解密算法类* @author JODY * @version P1.15.5 Mar 16, 2009 11:23:20 PM* @see 修订历史 * @see 相关类连接*/
public class Arithmetic {private IArithmetic Abehavior;//算法接口public IArithmetic getAbehavior() {return Abehavior;}/*** 动态替换算法* @param abehavior*/public void setAbehavior(IArithmetic abehavior) {Abehavior = abehavior;}/*** 加密* @param estr 明文* @return*/public String encrypt(String estr){return null;}/*** 解密* @param dstr 密文* @return*/public String decrypt(String dstr){return null;}
}

== 报文加密子类 ==

package com.jody.pattern.strategy;
/*** 功能/模块:设计模式* 类描述:报文加密* @author JODY* @version 1.0* @see 修订历史 * @see 相关类连接*/
public class Message extends Arithmetic {public Message(){//动态组合MD5算法setAbehavior(new MD5Impl());}public void display(){System.out.println("这是报文加密");}
}

== 算法接口 ==

package com.jody.pattern.strategy;
/*** 功能/模块:设计模式* 类描述:算法接口* @author JODY* @version 1.0* @see 修订历史 * @see 相关类连接*/
public interface IArithmetic {/*** 加密* @param estr* @return*/public String encrypt(String estr);/*** 解密* @param dstr* @return*/public String decrypt(String dstr);
}

== MD5算法实现类 ==

package com.jody.pattern.strategy;
/*** 功能/模块:设计模式* 类描述: MD5加密算法* @author JODY* @version 1.0* @see 修订历史 * @see 相关类连接*/
public class MD5Impl implements IArithmetic {public String decrypt(String dstr) {// TODO 加密return null;}public String encrypt(String estr) {// TODO 解密return null;}}

== 测试调用类 ==

package com.jody.pattern.strategy;
/*** 功能/模块:设计模式* 类描述: 测试类* @author JODY* @version 1.0* @see 修订历史 * @see 相关类连接*/
public class TestClass {public static void main(String args[]){Arithmetic a = new Message();//a.setAbehavior(new MD5Impl());//Message初始化了MD5ImplString dstr = a.encrypt(args[0]);//加密     }
}

说明:

当TestClass中实例new Message()报文算法时,初始化将采用MD5算法.这样调用者和提供者就独立开了,非常容易扩展。

设计原则:多用组合,少用继承

锈才学设计模式之 —— 策略模式(Strategy Pattern)相关推荐

  1. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式- Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  2. 二十四种设计模式:策略模式(Strategy Pattern)

    策略模式(Strategy Pattern) 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操 ...

  3. 设计模式实战-策略模式(Strategy Pattern)

    0 联系我 图片标题 1.Q群[Java开发技术交流]:jq.qq.com/?_wv=1027&a- 2.完整博客链接:www.shishusheng.com 3.知乎:www.zhihu.c ...

  4. 解读设计模式----策略模式(Strategy Pattern)

    一.模式概述      策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法.       在我应 ...

  5. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了"工厂模式"."策略模式" ...

  6. 关于设计模式——策略模式-Strategy Pattern

    文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...

  7. 设计模式——策略模式( Strategy Pattern )

    写代码超过千行,自定义类10个以上,往往写着写着就觉的乱,最终决定抽空补习下设计模式方面的知识.本来AS3出了本关于设计模式的书的,国人也翻译了.我同事也早早买了一本,但前些天我借来看了几页,翻译的太 ...

  8. 设计模式-策略模式(Strategy Pattern)

    Define a family of algorithms,encapsulate each one,and make them interchangeable(定义一组算法,将每个算法都封装起来,并 ...

  9. 设计模式之策略模式(Strategy)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

最新文章

  1. C# 利用SharpPcap实现网络包捕获嗅探
  2. iOS开发UI中懒加载的使用方法
  3. android开发4:Android布局管理器1(线性布局,相对布局RelativeLayout-案例)
  4. 01Hadoop简介
  5. 芯片开发者46%年收入达30万元,7纳米制程以内开发者30%超50万元
  6. select_arg_from_python相关的测试程序
  7. 漫画:什么是八皇后问题
  8. mysql5.7是测试版本吗_mysql免安装版本测试(mysql-5.7.18-winx64)
  9. linux自动重启电脑脚本,linux下通过脚本实现自动重启程序的方法
  10. 缺货警告!小米这款手机已被骂惨...
  11. Anaconda下载及详细安装图文教程(基于Windows操作系统)
  12. 微信公众号授权 提示内容与下载文件不符,请检查文件内容或重新上传
  13. 让机器学会断句:基于词典的Bigram分词算法
  14. SwiftUI 语音合成与语言识别教程之 03 实现录音文件转文字(含完整项目源码)SFSpeechURLRecognitionRequest
  15. 工业大型设备数字孪生 数字化改造三维动态大屏展示
  16. Android View Binding使用介绍
  17. 水笔:20年好用软件或者工具备忘
  18. html5仿mac商城css,html5+javascript+css商城(模拟联想)购物系统
  19. 基于Ovito的团簇识别分析
  20. win7系统口令登录过程调试方法图解

热门文章

  1. Tampermonkey油猴
  2. 求解无向图的各连通分支
  3. vmware虚拟化平台虚拟机迁移至H3C CAS虚拟化平台
  4. python人工智能项目实例-python人工智能项目实战,PDF+源码
  5. Educoder–Java高级特性(第一章)- IO流【笔记+参考代码】
  6. 前端mock数据 - mockjs
  7. 如何使用Colormaps和自定义自己喜欢的colorbar?
  8. 回归分析中,简述几种残差的定义?性质?作用以及特点?
  9. mysql varchar类型实例_Mysql实例MySQL数据类型varchar详解
  10. 【docker】教程 常用命令 基础使用