设计模式—策略模式

设计模式之策略模式

 

因为是跟工厂模式一同看的策略模式,刚开始还真没发现他们之间的区别。主要是《大话设计模式》书的作者在策略模式中用到了工厂模式。其实工厂模式是实现策略模式的一种方式,而具体策略模式是怎么样的,核心是什么,下面我们可以总结出来:

 

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;
	}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值