1. 程式人生 > >Java設計模式從精通到入門三 策略模式

Java設計模式從精通到入門三 策略模式

介紹

我儘量用最少的語言解釋總結:

Java23種設計模式之一,屬於行為型模式。一個類的行為或者演算法可以在執行時更改,策略物件改變context物件執行演算法。

應用例項:

​ 以周瑜賠了夫人又折兵的例子。

uml類圖如下

主要程式碼如下

策略介面

/**
 * @ClassName Stragety
 * @Description 策略抽象類
 * @Author ouyangkang
 * @Date 2018-11-15 09:06
 **/
public interface Stragety {

    void operation();
}

策略介面實現類

/**
 * @ClassName BackDoorStragety
 * @Description 喬國老開後門
 * @Author ouyangkang
 * @Date 2018-11-15 09:14
 **/
public class BackDoorStragety implements Stragety {

    @Override
    public void operation() {
        System.out.println("拜訪喬國老,請求開後門");
    }
}
/**
 * @ClassName GreenLightStragety
 * @Description 吳國太開綠燈
 * @Author ouyangkang
 * @Date 2018-11-15 09:16
 **/
public class GreenLightStragety implements Stragety {
    @Override
    public void operation() {
        System.out.println("拜訪吳國太,請求開綠燈");
    }
}

/**
 * @ClassName PostBreakStragety
 * @Description 孫夫人斷後
 * @Author ouyangkang
 * @Date 2018-11-15 09:18
 **/
public class PostBreakStragety implements Stragety {
    @Override
    public void operation() {
        System.out.println("拜訪孫夫人,請求斷後");
    }
}

context類


/**
 * @ClassName Context
 * @Description 策略執行
 * @Author ouyangkang
 * @Date 2018-11-15 09:18
 **/
public class Context {

    private Stragety stragety;

    public Context(Stragety stragety){
        this.stragety = stragety;
    }

    public void operation(){
        this.stragety.operation();
    }
}

main


/**
 * @ClassName Main
 * @Description TODO
 * @Author ouyangkang
 * @Date 2018/9/25 11:22
 **/
public class Main {

    public static void main(String[] args) {
        System.out.println("去往吳國, 劉備慌得一匹,趙雲開啟第一個錦囊");
        Context backDoor = new Context(new BackDoorStragety());
        backDoor.operation();

        System.out.println("--------------");

        System.out.println("劉備在吳國還不是美滋滋,美酒,美人, 趙雲開啟第二個錦囊");
        Context greenLight = new Context(new GreenLightStragety());
        greenLight.operation();

        System.out.println("--------------");

        System.out.println("準備撤了,趙雲開啟第三個精囊");
        Context postBreak = new Context(new PostBreakStragety());
        postBreak.operation();

        System.out.println("諸葛亮氣死周瑜");
    }
}

執行結果:

去往吳國, 劉備慌得一匹,趙雲開啟第一個錦囊
拜訪喬國老,請求開後門
--------------
劉備在吳國還不是美滋滋,美酒,美人, 趙雲開啟第二個錦囊
拜訪吳國太,請求開綠燈
--------------
準備撤了,趙雲開啟第三個精囊
拜訪孫夫人,請求斷後
諸葛亮氣死周瑜

總結

可以用策略模式代替過多的if else。更加的靈活