設計模式第二講--策略模式

簡介

策略模式屬於用處不少而且很簡單的一種設計模式web

在策略模式(Strategy Pattern)中,一個類的行爲或其算法能夠在運行時更改。這種類型的設計模式屬於行爲型模式。算法

策略模式中定義了算法家族,分別封裝起來,讓他們之間能夠相互替換,此模式讓算法的變化,不會影響到使用算法的客戶。小程序

場景描述

咱們再來假設一個場景,根據不一樣的下訂單入口對用戶進行積分獎勵設計模式

app下單用戶 web下單用戶 小程序下單用戶
獎勵100積分 獎勵20積分 獎勵50積分

壞代碼

package design.pattern.reward;

public class Reward {

    /**
     * 下單平臺 0 web  1 小程序 2 app
     */
    private int platform = 0;

    public Reward(int platform) {
        this.platform = platform;
    }

    /**
     * 給用戶送積分
     */
    public void giveScore() {

        int score = 0;

        switch (platform) {
            case 0: //web
                //todo
                score = 20;
                break;
            case 1: //小程序
                //todo
                score = 50;
                break;
            case 2: //app
                //todo
                score = 100;
                break;
        }

        System.out.println("送給用戶" + score + "分");
    }
}

複製代碼

業務調用:bash

package design.pattern.reward;

public class PayNotify {

    public static void main(String[] args) {

        Reward reward = new Reward(2);
        reward.giveScore();
    }
}
複製代碼

當咱們的算法愈來愈多,愈來愈複雜的時候,而且當某個算法發生變化,將對全部其餘計算方式都會產生影響,不能有效的彈性、清晰的拓展,因此這個時候咱們的策略模式就上場了。app

策略模式UML圖(畫圖工具不工做了)

策略模式實現

1.首先接口聲明-抽象策略工具

package design.pattern.reward.score;

public interface InterfaceScore {

    /**
     * 送積分
     */
    public void giveScore();
}
複製代碼

2.咱們實現接口的giveScore方法-實現具體策略算法ui

app端積分this

package design.pattern.reward.score;

public class AppScore implements InterfaceScore {

    private int score = 100;

    /**
     * 送積分
     */
    public void giveScore() {
        //todo 具體算法邏輯
        System.out.println("送你積分" + score);
    }
}
複製代碼

web端積分:spa

package design.pattern.reward.score;

public class WebScore implements InterfaceScore {

    private int score = 20;

    /**
     * 送積分
     */
    public void giveScore() {
        //todo 具體算法邏輯
        System.out.println("送你積分" + score);
    }
}
複製代碼
  1. 不一樣策略算法調度類
package design.pattern.reward;

import design.pattern.reward.score.InterfaceScore;

public class Context {

    private InterfaceScore scoreObj;

    public Context(InterfaceScore algorithmObj) {
        this.scoreObj = algorithmObj;
    }

    public void giveScore() {
        this.scoreObj.giveScore();
    }

}
複製代碼
  1. 客戶端調用
Context context1 = new Context(new AppScore());
context1.giveScore();

Context context2 = new Context(new WebScore());
context2.giveScore();
複製代碼

output:

送你積分100
送你積分20
複製代碼

好像跟咱們剛開始的調用方法不同,約定好的是傳一個type值來肯定計算的方法,如今直接將計算規則方法暴露給了調用方

繼續改造 策略模式+簡單工廠

package design.pattern.reward;

import design.pattern.reward.score.AppScore;
import design.pattern.reward.score.InterfaceScore;
import design.pattern.reward.score.WebScore;

public class Context {

    private InterfaceScore scoreObj;

    public Context(int platform) {
        switch (platform) {
            case 0: //web
                this.scoreObj = new WebScore();
                break;
            case 1: //小程序
                //todo
                break;
            case 2: //app
                this.scoreObj = new AppScore();
                break;
        }

    }

    public void giveScore() {
        this.scoreObj.giveScore();
    }
}
複製代碼

調用:

Context context1 = new Context(0);
context1.giveScore();

Context context2 = new Context(2);
context2.giveScore();
複製代碼

是否是很簡單。。。

總結:

策略模式是一種定義一系列算法的方法,從概念上來看,全部這些算法完成的都是相同的工做,只是實現不一樣,他能夠以相同的方式調用全部的算法.減小了算法與使用算法之間的耦合.

策略模式是用來封裝算法的,但在實踐中咱們能夠用它來封裝幾乎任何類型的規則, 只要在分析過程當中須要在不一樣時間應用不一樣的業務規則,就能夠考慮使用策略模式處理這種變化的可能性。

和上次講到的模版方法模式差別

模版方法模式使用了繼承方式實現算法,而策略模式使用了組合方式 模版方法模式對於算法擁有絕對的控制,而策略模式不對算法控制 模版方法的依賴程度要比策略模式高 。。。。。

更多精彩內容關注呆呆公衆號:

相關文章
相關標籤/搜索