1. 程式人生 > >設計模式之禪學習筆記04--策略模式

設計模式之禪學習筆記04--策略模式

-----謹以此文表明汪先生學過設計模式

1.策略模式

    定義一組演算法,將每個演算法都封裝起來,並且使它們之間可以互換。

    類圖:

          

● Strategy抽象策略

   策略、演算法家族的抽象,通常為介面,定義每個策略或演算法必須具有的方法和屬性。各

位看官可能要問了,類圖中的AlgorithmInterface是什麼意思,嘿嘿,algorithm是“運演算法則”的意思,結合起來意思就明白了吧。

● Context封裝角色

   它也叫做上下文角色,起承上啟下封裝作用,遮蔽高層模組對策略、演算法的直接訪問,

封裝可能存在的變化

● ConcreteStrategy具體策略角色

 實現抽象策略中的操作,該類含有具體的演算法。

2.舉個例子

  首先來一個策略介面

package com.wx.strategypattern.base;
/*
  抽象的策略
 */
public interface Strategy {
   public void show();
}

  實現策略介面:

package com.wx.strategypattern.imp;

import com.wx.strategypattern.base.Strategy;

public class ConcreateStrategy1 implements Strategy {
    @Override
    public void show() {
        System.out.println("策略1的方法");
    }
}


package com.wx.strategypattern.imp;

import com.wx.strategypattern.base.Strategy;

public class ConcreateStrategy2  implements Strategy {
    @Override
    public void show() {
        System.out.println("策略2的方法");
    }
}

  存放策略的地方Context類:

package com.wx.strategypattern.base;
/*
   它也叫做上下文角色,起承上啟下封裝作用,遮蔽高層模組對策略、
   演算法的直接訪問,封裝可能存在的變化
 */
public  class Context {
    private Strategy strategy=null;
    public Context(Strategy strategy)
    {

        this.strategy=strategy;
    }
    //封裝後的策略方法,再上下文物件中呼叫策略的方法
    public void doSomethings()
    {
        this.strategy.show();
    }
}

  測試:

package com.wx.strategypattern.test;

import com.wx.strategypattern.base.Context;
import com.wx.strategypattern.base.Strategy;
import com.wx.strategypattern.imp.ConcreateStrategy1;
import com.wx.strategypattern.imp.ConcreateStrategy2;

public class TestStrategy {
    public static void main(String[] args)
    {
        //工廠方法模式返回的是一個具體的產品物件,而這個策略模式返回的是一個Context上下文物件
        Strategy concreateStrategy1 = new ConcreateStrategy1();
        ConcreateStrategy2 strategy2 = new ConcreateStrategy2();
        Context context = new Context(concreateStrategy1);
        Context context1 = new Context(strategy2);
        context.doSomethings();
        context1.doSomethings();
    }
}

  測試結果:

  

策略模式的優點:

   演算法可以自由切換

避免使用多重條件

擴充套件性良好

策略模式的缺點:

   策略類數量增多

 所有的策略類都需要對外暴露

策略模式的使用場景:

  多個類只有在演算法或行為上稍有不同的場景

演算法需要自由切換的場景

需要遮蔽演算法規則的場景