当前位置:编程学习 > JAVA >>

《JAVA与模式》第16天—策略模式

策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
________________________________________
策略模式的结构
  策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。下面就以一个示意性的实现讲解策略模式实例的结构。
 
 这个模式涉及到三个角色:
  ●  环境(Context)角色:持有一个Strategy的引用。
  ●  抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
  ●  具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
使用场景
  假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的高级会员提供每本20%的促销折扣;对中级会员提供每本10%的促销折扣;对初级会员没有折扣。
  根据描述,折扣是根据以下的几个算法中的一个进行的:
  算法一:对初级会员没有折扣。
  算法二:对中级会员提供10%的促销折扣。
  算法三:对高级会员提供20%的促销折扣。
  使用策略模式来实现的结构图如下:
 

 
源代码
  抽象折扣类
[java] 
1. package com.bankht.Strategy; 
2.  
3. /**
4.  * @author: 特种兵—AK47
5.  * @创建时间:2012-6-26 下午10:16:58
6.  * 
7.  * @类说明 :抽象折扣类
8.  */ 
9. public interface MemberStrategy { 
10.     /**
11.      * 计算图书的价格
12.      * 
13.      * @param booksPrice
14.      *            图书的原价
15.      * @return 计算出打折后的价格
16.      */ 
17.     public double calcPrice(double booksPrice); 
18. } 
 

 初级会员折扣类
[java]
1. package com.bankht.Strategy; 
2.  
3. /**
4.  * @author: 特种兵—AK47
5.  * @创建时间:2012-6-26 下午10:17:28
6.  * 
7.  * @类说明 :初级会员折扣类
8.  */ 
9. public class PrimaryMemberStrategy implements MemberStrategy { 
10.  
11.     @Override 
12.     public double calcPrice(double booksPrice) { 
13.  
14.         System.out.println("对于初级会员的没有折扣"); 
15.         return booksPrice; 
16.     } 
17.  
18. } 
 

 
  中级会员折扣类
[java]
1. package com.bankht.Strategy; 
2.  
3. /**
4.  * @author: 特种兵—AK47
5.  * @创建时间:2012-6-26 下午10:18:15
6.  * 
7.  * @类说明 :中级会员折扣类
8.  */ 
9. public class IntermediateMemberStrategy implements MemberStrategy { 
10.  
11.     @Override 
12.     public double calcPrice(double booksPrice) { 
13.  
14.         System.out.println("对于中级会员的折扣为10%"); 
15.         return booksPrice * 0.9; 
16.     } 
17.  
18. } 
 

 
  高级会员折扣类
[java] 
1. package com.bankht.Strategy; 
2.  
3. /**
4.  * @author: 特种兵—AK47
5.  * @创建时间:2012-6-26 下午10:18:59
6.  * 
7.  * @类说明 :高级会员折扣类
8.  */ 
9. public class AdvancedMemberStrategy implements MemberStrategy { 
10.  
11.     @Override 
12.     public double calcPrice(double booksPrice) { 
13.  
14.         System.out.println("对于高级会员的折扣为20%"); 
15.         return booksPrice * 0.8; 
16.     } 
17. } 
 

 
   价格类
[java]
1. package com.bankht.Strategy; 
2.  
3. /**
4.  * @author: 特种兵—AK47
5.  * @创建时间:2012-6-26 下午10:19:22
6.  * 
7.  * @类说明 :价格类
8.  */ 
9. public class Price { 
10.     // 持有一个具体的策略对象  
11.     private MemberStrategy strategy; 
12.  
13.     /**
14.      * 构造函数,传入一个具体的策略对象
15.      * 
16.      * @param strategy
17.      *            具体的策略对象
18.      */ 
19.     public Price(MemberStrategy strategy) { 
20.         this.strategy = strategy; 
21.     } 
22.  
23.     /**
24.      * 计算图书的价格
25.      * 
26.      * @param booksPrice
27.      *            图书的原价
28.      * @return 计算出打折后的价格
29.      */ 
30.     public double quote(double booksPrice) { 
31.         return this.strategy.calcPrice(booksPrice); 
32.     } 
33. } 
 

 
  客户端
[java] 
1. package com.bankht.Strategy; 
2.  
3. /**
4.  * @author: 特种兵—AK47
5.  * @创建时间:2012-6-26 下午10:19:48
6.  * 
7.  * @类说明 :客户端
8.  */ 
9. public class Client { 
10.  
11.     public static void main(String[] args) { 
12.         // 选择并创建需要使用的策略对象  
13.         MemberStrategy strategy = new AdvancedMemberStrategy(); 
14.          
15.         // 创建环境  
16.         Price price = new Price(strategy); 
17.         // 计算价格  
18.    

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,