(十三)策略模式
策略模式定義了多個封裝起來的算法,封裝的算法可以相互替換,並且算法的變化不會影響到使用算法的客戶。借用另一位大神的例子。
interface ICalculator{
public int calculate(String exp);
}
abstract class AbstractCalculator{
public int[] split(String exp,String opt){
String array[] = exp.split(opt);
int arrayInt[] = new int[2];
arrayInt[0] = Integer.parseInt(array[0]);
arrayInt[1] = Integer.parseInt(array[1]);
return arrayInt;
}
}
class Plus extends AbstractCalculator implements ICalculator{
public int calculate(String exp){
int arrayInt[] = split(exp, "\\+");
return arrayInt[0]+arrayInt[1];
}
}
class Minus extends AbstractCalculator implements ICalculator{
public int calculate(String exp){
int arrayInt[] = split(exp,"-");
return arrayInt[0] = arrayInt[1];
}
}
class Multiply extends AbstractCalculator implements ICalculator{
public int calculate(String exp){
int arrayInt[] = split(exp,"\\*");
return arrayInt[0] * arrayInt[1];
}
}
public class Strategy {
public static void main(String[] args){
String exp = "2*8";
ICalculator cal = new Multiply();
System.out.println(cal.calculate(exp));
}
}
系統提供不同算法的實現,對於各種算法封裝好,用戶決定使用哪個算法。策略模式多使用在算法決策系統中,例如電子商務價格算法。跟抽象類很相似,我感覺。
(十四)模板方法模式
模板方法的意義是一個父類方法提供大部分的算法,子類完成剩餘的算法。父類調用子類的實現。
abstract class TemplateCalc{
//主方法
public final int calculate(String exp,String opt){
int array[] = split(exp,opt);
return calculate(array[0],array[1]);
}
public int[] split(String exp,String opt){
String array[] = exp.split(opt);
int arrayInt[] = new int[2];
arrayInt[0] = Integer.parseInt(array[0]);
arrayInt[1] = Integer.parseInt(array[1]);
return arrayInt;
}
abstract public int calculate(int num1,int num2);
}
class PlusTemp extends TemplateCalc{
public int calculate(int num1,int num2){
return num1 + num2;
}
}
public class Template{
public static void main(String[] args){
TemplateCalc tem = new PlusTemp();
System.out.println(tem.calculate("12*23", "\\*"));
}
}
將一個子類初始化,調用父類的 calculate 方法,父類執行完分解,調用子類的相加,其實 * 並不代表乘,只是個切分符號。