设计模式之策略模式_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 设计模式之策略模式

设计模式之策略模式

 2013/7/12 0:14:55  wangkechao.dream  程序员俱乐部  我要评论(0)
  • 摘要:1.什么是策略模式?策略模式针对的是在不同的环境中,客户端选择使用不同的策略。2.为什么使用策略模式?当增加一种新的算法的时候,只需要在客户端登记即可。相当于“可插入的算法”。扩展性更好。3.什么时候使用策略模式?如果一个系统需要动态的从几种算法中选择一种算法。则使用策略模式。4.策略模式在java中的应用比如说awt包中的Container提供了不同的排列方式,BorderLayout,FlowLayout,BirdLayout等。我的理解,是有一个策略类【包括实现了该策略的具本类
  • 标签:模式 设计 设计模式

1. 什么是策略模式?

策略模式针对的是在不同的环境中,客户端选择使用不同的策略。

2. 为什么使用策略模式?

当增加一种新的算法的时候,只需要在客户端登记即可。相当于“可插入的算法”。扩展性更好。

3. 什么时候使用策略模式?

如果一个系统需要动态的从几种算法中选择一种算法。则使用策略模式。

4. 策略模式在java中的应用

比如说 awt包中的Container提供了不同的排列方式,BorderLayout , FlowLayout,BirdLayout等。

?

我的理解,是有一个策略类【包括实现了该策略的具本类】以及注册了相应策略的具体实现类,如果策略需要做变动则只需改变实现策略的代码,而无需修注册了该策略的客户端

Example: 移动短信有两种策略:全球通用户? 神州行用户 不同用户扣费标准不同

1. 策略接口

class="java">public interface ISMSStrategy {
	//做一件事情,扣钱
	public void deductMoney(User user);
}

?2. 全球通策略实现类

?

public class GSMSMSStrategy implements  ISMSStrategy{
	
	//全球通-100块钱
	public void deductMoney(User user){
		System.out.println("全球通执行策略以前"+user.getMoney());
		user.setMoney(user.getMoney()-200);
		System.out.println("全球通执行策略以后"+user.getMoney());
	}
}

?3. 神州行实现类

?

public class EasyownStrategy implements ISMSStrategy{

	//神州行用户-200
	public void deductMoney(User user) {
		System.out.println("神州行执行策略以前"+user.getMoney());
		user.setMoney(user.getMoney()-100);
		System.out.println("神州行执行策略以后"+user.getMoney());
	}
}

?4. 定义一个用户实体

?

public class User {
	public int money;
	/*实现策略模式的重点在这里*/
	public ISMSStrategy smsStrategy;//该用户 办理的业务套餐

 
	public int getMoney() {
		return money;
	}

	public void setMoney(int money) {
		this.money = money;
	}

	public ISMSStrategy getSmsStrategy() {
		return smsStrategy;
	}

	public void setSmsStrategy(ISMSStrategy smsStrategy) {
		this.smsStrategy = smsStrategy;
	}
}

?

?

5. 再定义一个结算器

public class Balance {
   //月末结算了
	public void deductMoney(User user){
		user.getSmsStrategy().deductMoney(user);
	}
}

?6. 程序入口

?

public class Main {
	
	public static void main(String[] args) {
		Balance balance = new Balance();
		//定义 一个神州行的用户
		ISMSStrategy easyownStrategy =  new EasyownStrategy();
		User easyownUser = new User();
		easyownUser.setMoney(1000);
		//办理了一个神州行短信套餐
		easyownUser.setSmsStrategy(easyownStrategy);
		System.err.println("神州行的用户到了月末结算的时候");
		//到了月末结算
		balance.deductMoney(easyownUser);
		// 定义 一个全球通的用户
		ISMSStrategy GSMStrategy = new GSMSMSStrategy();
		User gsmUser = new User();
		gsmUser.setMoney(1000);
		// 办理了一个全球通短信套餐
		gsmUser.setSmsStrategy(GSMStrategy);
		System.err.println("全球通的用户到了月末结算的时候");
		// 到了月末结算
		balance.deductMoney(gsmUser);
	}
}

?整套代码实现了是一个策略模式的完整实现

?

如果哪天全球通的资费需要做修改,只需要修改GSMSMSStrategy类里面的deductMoney(User user)方法,User类是不用修改的

?

我也是初学,HY批评指正,共同进步

?

参考源文档 <http://blog.csdn.net/hu_xinxin/article/details/9209677> ,此处致谢

?

发表评论
用户名: 匿名