策略模式:定义了算法族,分别封装起来,让他们之间能够相互替换,此模式让算法的变化独立于使用算法的客户html
该模式涉及三个角色:java
● 环境(Context)角色:持有一个Strategy的引用。算法
● 抽象策略(Strategy)角色:这是一个抽象角色,一般由一个接口或抽象类实现。此角色给出全部的具体策略类所需的接口。数据库
● 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。编程
策略模式的使用场景:设计模式
1)针对同一种问题的多种处理方式、仅仅是由于具体行为有差异时,安全
2)须要安全的封装多种同一类型的操做时ide
3)出现同一抽象类有多个子类,而又须要使用if-else或者switch-case来选择具体子类时this
把生活中的鸭子看做环境角色,它们的行动看做抽象策略角色,每种动做的实现看做具体策略角色。好比,鸭子飞行和叫声的行为,有的能够用翅膀飞行,有不能飞行;有的是呱呱叫,有的是吱吱叫。他们之间的关系图是:加密
鸭子自身不实现飞行和叫声的行为(算法),把这两个行为(算法)托付给了两个接口。每当须要建立出鸭子来的时候,能够决定鸭子这个鸭子的飞行方式和叫声。若是鸭子进化成能够说人话,只须要实现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
java设计模式--策略模式上文概念内容大部分来源于这文章
Head First 设计模式