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

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

概念

策略模式:定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户

图片描述

该模式涉及三个角色:

  ● 环境(Context)角色:持有一个Strategy的引用。

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

  ● 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

策略模式的使用场景:

1)针对同一种问题的多种处理方式、仅仅是因为具体行为有差别时,

2)需要安全的封装多种同一类型的操作时

3)出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时

举个栗子

把生活中的鸭子看作环境角色,它们的行动看作抽象策略角色,每种动作的实现看作具体策略角色。比如,鸭子飞行和叫声的行为,有的可以用翅膀飞行,有不能飞行;有的是呱呱叫,有的是吱吱叫。他们之间的关系图是:

图片描述

鸭子自身不实现飞行和叫声的行为(算法),把这两个行为(算法)托付给了两个接口。每当需要创建出鸭子来的时候,可以决定鸭子这个鸭子的飞行方式和叫声。如果鸭子进化成可以说人话,只需要实现QuackBehavior接口即可,而不用修改鸭子的内部。

再一个栗子

在编程中,用户的密码保存到数据库前往往需要对密码加密,可以使用这个模式定义不同的加密算法,随机使用不同的算法加密。[emmm,不知道会不会有人这么做,一般都是加盐加醋]

用户类

public class User {     /**     * 加密接口     */    private Encryption encryption;    private String password;    public void setEncryption(Encryption encryption) {        this.encryption = encryption;    }    public void setPassword(String password) {        this.password = password;    }    public String getPassword() {        return encryption.encrypt(password);    }}

加密接口

public interface Encryption {    String encrypt(String s);}

两个实现类

public class Md5Encrypt implements Encryption{    @Override    public String encrypt(String s) {        return s + "md5";    }}
public class SHAEncrypt implements Encryption{    @Override    public String encrypt(String s) {        return s + "sha";    }}

使用:

public class Main {    public static void main(String[] args) {        User user = new User();        user.setEncryption(new Md5Encrypt());        user.setPassword("1234");        System.out.println("伪MD5加密:" + user.getPassword());        user.setEncryption(new SHAEncrypt());        System.out.println("伪SHA加密:" + user.getPassword());    }}

输出:

伪MD5加密:1234md5伪SHA加密:1234sha

参考来源

上文概念内容大部分来源于这文章

Head First 设计模式

转载地址:http://diyqa.baihongyu.com/

你可能感兴趣的文章
你是“领导”你做主-计算机专业的习题
查看>>
将计算机加入到域的方法--脚本和更改系统属性
查看>>
高性能HTTP加速器Varnish(管理维护篇)
查看>>
算法精讲学习笔记 大数据和位运算
查看>>
Newtonsoft.Json(Json.Net)学习
查看>>
Linux 小知识翻译 - 「分区」
查看>>
EF7 Code First Only-所引发的一些“臆想”
查看>>
HTTPS的七个误解(译文转载)
查看>>
使用 yum 安装 virtualbox 虚拟机
查看>>
mysql03---触发器
查看>>
Azure Automation (3) 定期将某个Azure订阅下的所有虚拟机开关机
查看>>
Nginx 中缓存静态文件秘籍
查看>>
Java Thread 多线程同步、锁、通信
查看>>
tkinter菜单图标,工具栏
查看>>
使用 dep 配置 golang 开发环境
查看>>
《CLR Via C# 第3版》笔记之(二十一) - 异步编程模型(APM)
查看>>
vue.js 2.0 官方文档学习笔记 —— 01. vue 介绍
查看>>
分布式系统理论之两阶段提交协议
查看>>
linux多线程学习笔记六--一次性初始化和线程私有数据【转】
查看>>
ExtJS 4.2 教程-06:服务器代理(proxy)
查看>>