论坛首页 编程语言技术论坛

设计模式(一)——策略模式

浏览 4420 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-07-04  

设计模式(一)——策略模式

 

本文描述的是策略模式

我们假设有如下场景:

         我们使用聊天工具聊天时,可以发送点对点消息(私聊)和点对多消息(群聊),而发送不同的消息执行的操作是不一样的,也就是说我们在不同的场景下(私聊或者群聊)发送消息时会调用不同的发送方法,但是我们只有一个消息发送器(可以理解为发送消息时的发送按钮),我们希望可以通过这消息发送器发送任何类型的消息。

所以如下代码描述了如何使用策略模式实现上述需求:

我们先定义一个消息的公共接口,所有不同类型的消息都实现这个接口,这个接口包含一个发送方法

 

Java代码 
  1. package com.gy.designpattern.strategy;  
  2. /** 
  3.  * ClassName:IMessage <br/> 
  4.  * Function: 这是一个消息的接口,所有的消息都要实现这个接口. <br/> 
  5.  * Reason:   TODO ADD REASON. <br/> 
  6.  * Date:     2012-7-3 下午3:09:07 <br/> 
  7.  * @author   gongyong 
  8.  * @version 
  9.  * @since    JDK 1.6 
  10.  * @see 
  11.  */  
  12. public interface IMessage {  
  13.   
  14.     /** 
  15.      * send:所有的消息都有一个操作,发送. <br/> 
  16.      * @author gongyong 
  17.      * @since JDK 1.6 
  18.      */  
  19.     public void send();  
  20.   
  21. }  

 

 然后我们定义两个类实现该接口,分别是一个点对点消息和点对多消息:

 

Java代码 
  1. package com.gy.designpattern.strategy;  
  2. /** 
  3.  * ClassName:P2MMessage <br/> 
  4.  * Function: 点对多消息. <br/> 
  5.  * Reason:   . <br/> 
  6.  * Date:     2012-7-3 下午3:15:05 <br/> 
  7.  * @author   gongyong 
  8.  * @version 
  9.  * @since    JDK 1.6 
  10.  * @see 
  11.  */  
  12. public class P2MMessage implements IMessage{  
  13.   
  14.     /** 
  15.      * 发送给许多人. 
  16.      * @see com.gy.designpattern.strategy.IMessage#send() 
  17.      */  
  18.     @Override  
  19.     public void send(){  
  20.   
  21.         System.out.println("这是点对多消息,将发送给许多人");  
  22.   
  23.     }  
  24.   
  25. }  

 

 

Java代码 
  1. package com.gy.designpattern.strategy;  
  2. /** 
  3.  * ClassName:P2PMessage <br/> 
  4.  * Function: 点多点消息. <br/> 
  5.  * Reason:   TODO ADD REASON. <br/> 
  6.  * Date:     2012-7-3 下午3:12:14 <br/> 
  7.  * @author   gongyong 
  8.  * @version 
  9.  * @since    JDK 1.6 
  10.  * @see 
  11.  */  
  12. public class P2PMessage implements IMessage{  
  13.   
  14.     /** 
  15.      * 发送给单个人. 
  16.      * @see com.gy.designpattern.strategy.IMessage#send() 
  17.      */  
  18.     @Override  
  19.     public void send(){  
  20.   
  21.         System.out.println("这是点对点消息,将发送给一个人");  
  22.   
  23.     }  
  24.   
  25. }  

 然后定义一个消息发送器

 

Java代码 
  1. package com.gy.designpattern.strategy;  
  2. /** 
  3.  * ClassName:MessageSender <br/> 
  4.  * Function: 消息发送器. <br/> 
  5.  * Reason:   TODO ADD REASON. <br/> 
  6.  * Date:     2012-7-3 下午3:18:24 <br/> 
  7.  * @author   gongyong 
  8.  * @version 
  9.  * @since    JDK 1.6 
  10.  * @see 
  11.  */  
  12. public class MessageSender {  
  13.     /** 
  14.      * message:将要使用到的消息. 
  15.      * @since JDK 1.6 
  16.      */  
  17.     private IMessage message;  
  18.   
  19.     /** 
  20.      * 构造函数,你要使用哪个消息. 
  21.      * 
  22.      * @param message 
  23.      */  
  24.     public MessageSender(IMessage message){  
  25.         this.message=message;  
  26.     }  
  27.   
  28.   
  29.     /** 
  30.      * send:ok,发送消息. <br/> 
  31.      * @author gongyong 
  32.      * @since JDK 1.6 
  33.      */  
  34.     public void send(){  
  35.         this.message.send();  
  36.     }  
  37.   
  38. }  

 最后我们看如何使用这个消息发送器发送不同类型的消息,我们假设有一个用户:

 

Java代码 
  1. package com.gy.designpattern.strategy;  
  2. /** 
  3.  * ClassName:SomeUser <br/> 
  4.  * Function: 这就是将发送消息的用户,爱谁谁 <br/> 
  5.  * Reason:   TODO ADD REASON. <br/> 
  6.  * Date:     2012-7-3 下午3:24:02 <br/> 
  7.  * @author   gongyong 
  8.  * @version 
  9.  * @since    JDK 1.6 
  10.  * @see 
  11.  */  
  12. public class SomeUser {  
  13.   
  14.     /** 
  15.      * main:某个人将依次先发送一条点对点消息,然后发送一条广播消息. <br/> 
  16.      * @author gongyong 
  17.      * @param args 
  18.      * @since JDK 1.6 
  19.      */  
  20.     public static void main(String[] args){  
  21.   
  22.         //先建立一个消息发送器  
  23.         MessageSender messageSender;  
  24.   
  25.         System.out.println("-----发送一条点对点消息-----");  
  26.         messageSender=new MessageSender(new P2PMessage()); //创建消息  
  27.         messageSender.send();//发送  
  28.   
  29.   
  30.         System.out.println("-----发送一条点对多消息-----");  
  31.         messageSender=new MessageSender(new P2MMessage()); //创建消息  
  32.         messageSender.send();//发送  
  33.   
  34.     }  
  35.   
  36. }  
 

OK,到这里,一个简单的策略模式的实现就完成了,使用策略模式的好处是,我们可以使用这个消息发送器发送任何类型的消息,而你要做的就是定义一个新的消息,该消息实现了IMessage接口,然后通过这个消息发送器就可以调用,其余的都不用考虑。

论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics