设计模式之策略模式
因为是跟工厂模式一同看的策略模式,刚开始还真没发现他们之间的区别。主要是《大话设计模式》书的作者在策略模式中用到了工厂模式。其实工厂模式是实现策略模式的一种方式,而具体策略模式是怎么样的,核心是什么,下面我们可以总结出来:
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; } }
原文地址:http://blog.csdn.net/feishangbeijixing/article/details/46303715