天天看點

設計模式(二十一)----- 政策模式(Strategy)----(JAVA版)

政策模式

   政策模式定義了一系列的算法,并将每一個算法封裝起來,而且使它們還可以互相替換。政策模式讓算法獨立于使用它的客戶而獨立變化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)

适用性

1.許多相關的類僅僅是行為有異,政策模式提供了一種用多個行為中的一個行為來配置一個類的文法

2.需要使用一個算法的不同變體 

3.算法使用客戶不應該的資料。可使用政策模式以避免暴露複雜的,與算法相關的資料結構

4.一個類定義了多種行為,并且這些行為在這個類中的操作中以多個條件語句的形式出現,将相關的條件分支移入它們各自的Strategy類中以代替這些條件語句

參與者

1.strategy

  定義一個接口,作為支援的所有算法的基礎,Context使用這個接口來調用ConcreteStrategy定義的算法

2.ConcreteStrategy

  以strategy接口實作的具體算法

3.Context

  維護一個strategy對象的引用,用一個ConcreteStrategy來配置context.同時定義一個方法,在方法體中實作strategy對它自己method()方法的引用:

類圖:

設計模式(二十一)----- 政策模式(Strategy)----(JAVA版)

一個例子:

1.strategy

public interface Strategy {
 void method();
}
           

2.ConcreteStrategy

public class StrategyImpl1 implements Strategy {

 @Override
 public void method() {
  System.out.println("這是一的實作!!!");
 }
}
           
public class StrategyImpl2 implements Strategy {

 @Override
 public void method() {
  System.out.println("這是二的實作!!!");
 }
}
           
public class StrategyImpl3 implements Strategy {

 @Override
 public void method() {
  System.out.println("這是三的實作!!!");
 }
}
           

3.Context

public class Context {
 Strategy s;

 public Context(Strategy s) {
  this.s = s;
 }

 public void action() {
  s.method();
 }
}
           

Test:

public class Test {
 public static void main(String[] args) {
  Context c1 = new Context(new StrategyImpl1());
  c1.action();

  Context c2 = new Context(new StrategyImpl2());
  c2.action();

  Context c3 = new Context(new StrategyImpl3());
  c3.action();
 }
}
           

result:

這是一的實作!!!

這是二的實作!!!

這是三的實作!!!