策略模式:定義了算法族,分別封裝起來,讓他們之間能夠相互替換,此模式讓算法的變化獨立於使用算法的客戶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 設計模式