设计模式(一)——策略模式
本文描述的是策略模式
我们假设有如下场景:
我们使用聊天工具聊天时,可以发送点对点消息(私聊)和点对多消息(群聊),而发送不同的消息执行的操作是不一样的,也就是说我们在不同的场景下(私聊或者群聊)发送消息时会调用不同的发送方法,但是我们只有一个消息发送器(可以理解为发送消息时的发送按钮),我们希望可以通过这消息发送器发送任何类型的消息。
所以如下代码描述了如何使用策略模式实现上述需求:
我们先定义一个消息的公共接口,所有不同类型的消息都实现这个接口,这个接口包含一个发送方法
- package com.gy.designpattern.strategy;
- /**
- * ClassName:IMessage <br/>
- * Function: 这是一个消息的接口,所有的消息都要实现这个接口. <br/>
- * Reason: TODO ADD REASON. <br/>
- * Date: 2012-7-3 下午3:09:07 <br/>
- * @author gongyong
- * @version
- * @since JDK 1.6
- * @see
- */
- public interface IMessage {
- /**
- * send:所有的消息都有一个操作,发送. <br/>
- * @author gongyong
- * @since JDK 1.6
- */
- public void send();
- }
然后我们定义两个类实现该接口,分别是一个点对点消息和点对多消息:
- package com.gy.designpattern.strategy;
- /**
- * ClassName:P2MMessage <br/>
- * Function: 点对多消息. <br/>
- * Reason: . <br/>
- * Date: 2012-7-3 下午3:15:05 <br/>
- * @author gongyong
- * @version
- * @since JDK 1.6
- * @see
- */
- public class P2MMessage implements IMessage{
- /**
- * 发送给许多人.
- * @see com.gy.designpattern.strategy.IMessage#send()
- */
- @Override
- public void send(){
- System.out.println("这是点对多消息,将发送给许多人");
- }
- }
- package com.gy.designpattern.strategy;
- /**
- * ClassName:P2PMessage <br/>
- * Function: 点多点消息. <br/>
- * Reason: TODO ADD REASON. <br/>
- * Date: 2012-7-3 下午3:12:14 <br/>
- * @author gongyong
- * @version
- * @since JDK 1.6
- * @see
- */
- public class P2PMessage implements IMessage{
- /**
- * 发送给单个人.
- * @see com.gy.designpattern.strategy.IMessage#send()
- */
- @Override
- public void send(){
- System.out.println("这是点对点消息,将发送给一个人");
- }
- }
然后定义一个消息发送器
- package com.gy.designpattern.strategy;
- /**
- * ClassName:MessageSender <br/>
- * Function: 消息发送器. <br/>
- * Reason: TODO ADD REASON. <br/>
- * Date: 2012-7-3 下午3:18:24 <br/>
- * @author gongyong
- * @version
- * @since JDK 1.6
- * @see
- */
- public class MessageSender {
- /**
- * message:将要使用到的消息.
- * @since JDK 1.6
- */
- private IMessage message;
- /**
- * 构造函数,你要使用哪个消息.
- *
- * @param message
- */
- public MessageSender(IMessage message){
- this.message=message;
- }
- /**
- * send:ok,发送消息. <br/>
- * @author gongyong
- * @since JDK 1.6
- */
- public void send(){
- this.message.send();
- }
- }
最后我们看如何使用这个消息发送器发送不同类型的消息,我们假设有一个用户:
- package com.gy.designpattern.strategy;
- /**
- * ClassName:SomeUser <br/>
- * Function: 这就是将发送消息的用户,爱谁谁 <br/>
- * Reason: TODO ADD REASON. <br/>
- * Date: 2012-7-3 下午3:24:02 <br/>
- * @author gongyong
- * @version
- * @since JDK 1.6
- * @see
- */
- public class SomeUser {
- /**
- * main:某个人将依次先发送一条点对点消息,然后发送一条广播消息. <br/>
- * @author gongyong
- * @param args
- * @since JDK 1.6
- */
- public static void main(String[] args){
- //先建立一个消息发送器
- MessageSender messageSender;
- System.out.println("-----发送一条点对点消息-----");
- messageSender=new MessageSender(new P2PMessage()); //创建消息
- messageSender.send();//发送
- System.out.println("-----发送一条点对多消息-----");
- messageSender=new MessageSender(new P2MMessage()); //创建消息
- messageSender.send();//发送
- }
- }
OK,到这里,一个简单的策略模式的实现就完成了,使用策略模式的好处是,我们可以使用这个消息发送器发送任何类型的消息,而你要做的就是定义一个新的消息,该消息实现了IMessage接口,然后通过这个消息发送器就可以调用,其余的都不用考虑。