您的位置:首页 > 其它

4.设计模式之策略模式

2013-08-29 09:50 246 查看
1. 什么是策略模式?

策略模式针对的是在不同的环境中,客户端选择使用不同的策略。
2. 为什么使用策略模式?

当增加一种新的算法的时候,只需要在客户端登记即可。相当于“可插入的算法”。扩展性更好。
3. 什么时候使用策略模式?
如果一个系统需要动态的从几种算法中选择一种算法。则使用策略模式。

4. 策略模式在java中的应用
比如说 awt包中的Container提供了不同的排列方式,BorderLayout , FlowLayout,BirdLayout等。
 
我的理解,是有一个策略类【包括实现了该策略的具本类】以及注册了相应策略的具体实现类,如果策略需要做变动则只需改变实现策略的代码,而无需修注册了该策略的客户端
Example: 移动短信有两种策略:全球通用户和  神州行用户 不同用户扣费标准不同
1. 策略接口
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批评指正,共同进步
 
参考源文档 </article/10229867.html> ,此处致谢
返回导航

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: