设计模式之策略模式
因为是跟工厂模式一同看的策略模式,刚开始还真没发现他们之间的区别。主要是《大话设计模式》书的作者在策略模式中用到了工厂模式。其实工厂模式是实现策略模式的一种方式,而具体策略模式是怎么样的,核心是什么,下面我们可以总结出来:
1、策略模式根本上来说就是封装了算法,不考虑具体实现,只考虑得到结果的模式。因此策略模式又叫算法簇模式,定义不同的算法,并且具体算法之间可以互相替换。
2、策略模式的关键好处在于动态改变对象的行为
3、策略模式将算法单独拿出来,然后将封装了的算法进行抽象,再具体实现这些抽象接口(可以重点考虑工厂模式来实现,呵呵,容易搞混淆)
参考《大话设计模式》中开发商场促销软件的例子来说明策略模式
自己学着敲敲策略模式的实现代码
package strategy_simple;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class strategy_simple {
private final String DAZHE = "打折";
private final String MANFAN = "满反";
private final String ZHENGCHANG = "正常";
private Idaz mdaz;
public strategy_simple() throws IOException, MyException {
BufferedReader BReader = new BufferedReader(new InputStreamReader(
System.in));
System.out.println("请输入账单金额: " + "\n");
String str = BReader.readLine();
// 输出打折后的信息
// new daZ(1, 1500, 50, 0.8, 0, 0, 2500);
this.mdaz = getIdaz(MANFAN);
this.getResult(Double.valueOf(str), mdaz);
}
private double getResult(double total, Idaz idaz) throws MyException {
if(idaz != null){
System.out.println(idaz.getResult(total));
return 0;
}
else
throw new MyException();
}
private Idaz getIdaz(String kind) {
switch (kind) {
case DAZHE:
return new dazhe_celue();
case MANFAN:
return new dazhe_celue2();
case ZHENGCHANG:
return new dazhe_celue3();
default:
break;
}
return null;
}
public static void main(String[] args) {
try {
new strategy_simple();
} catch (IOException e) {
e.printStackTrace();
} catch (MyException e) {
e.printStackTrace();
}
}
}
class MyException extends Exception{
@Override
public void printStackTrace() {
super.printStackTrace();
System.out.println("construct error");
}
}
interface Idaz {
abstract double getResult(double total);
}
class dazhe_celue implements Idaz {
@Override
public double getResult(double total) {
System.out.println("这是打八折方式 :");
return total * 0.8;
}
}
class dazhe_celue2 implements Idaz {
@Override
public double getResult(double total) {
System.out.println("这是满**减**的优惠方式 :");
return total - 100;
}
}
class dazhe_celue3 implements Idaz {
@Override
public double getResult(double total) {
System.out.println("这是正常收费方式 :");
return total;
}
}