JAVA設計模式-策略模式

概念

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

相關文章
相關標籤/搜索