策略模式的核心思想
策略模式是一系列的算法,並將每一個算法封裝起來,使它們還可以相互替換。策略模式讓算法的變化不會影響到使用算法的客戶。
策略模式將一系列的算法包裝爲一個接口抽象類的子類,並由調用者決定調用某一個子類。
策略接口類ICaculator:爲各種策略具體類定義了統一的計算器接口:
public interface ICalculator {
public int calculate(String expression);
}
具體策略類:他們都實現了策略接口類ICaculator,以得到同樣的策略接口函數,並繼承了抽象類,可以擁有共同的使用函數。
加法:
public class Plus extends AbstractCalculator implements ICalculator{
@Override
public int calculate(String expression) {
// TODO Auto-generated method stub
int[] array=split(expression,"\\+");
return array[0]+array[1];
}
}減法:
public class Minus extends AbstractCalculator implements ICalculator {
@Override
public int calculate(String expression) {
// TODO Auto-generated method stub
int[] array=split(expression,"-");
return array[0]-array[1];
}
}乘法:
public class Multiply extends AbstractCalculator implements ICalculator{
@Override
public int calculate(String expression) {
// TODO Auto-generated method stub
int[] array=split(expression,"\\*");
return array[0]*array[1];
}
}除法:
public class Devide extends AbstractCalculator implements ICalculator{
@Override
public int calculate(String expression) {
// TODO Auto-generated method stub
int[] array=split(expression,"/");
return array[0]/array[1];
}
}默認方法:
public class Default extends AbstractCalculator implements ICalculator {
@Override
public int calculate(String expression) {
// TODO Auto-generated method stub
return 0;
}
}
策略抽象類,可以擁有共同的輔助函數
public class Test {
public static void main(String[] args) {
while(true){
Scanner scan=new Scanner(System.in);
String expression=scan.next();
ICalculator calculator;
if(expression.indexOf("+")!=-1){
calculator=new Plus();
}else if(expression.indexOf("-")!=-1){
calculator=new Minus();
}else if(expression.indexOf("*")!=-1){
calculator=new Multiply();
}else if(expression.indexOf("/")!=-1){
calculator=new Devide();
}else{
calculator=new Default();
}
int value=calculator.calculate(expression);
System.out.println("="+value);
}
}
}
策略模式是一個提倡“針對接口編程”的模式,而使用接口的目的是爲了統一標準或者說是爲了制定一種強制的規則。
策略模式並不決定在何時使用算法,因爲使用何種算法決定權在用戶,也就是說我們需要調用策略模式中定義好的算法之前,必須選擇一種具體的策略算法。