策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。
程序汪发现特别是业务中有发消息的模式,特别适合策略模式,当然各种营销模式也可以,代码上代码案例加深下理解吧
具体案例一:
策略模式在发送不同类型消息(如短信、邮件、推送通知等)的场景下非常适用,因为它允许你在运行时选择不同的消息发送策略。下面是一个使用策略模式实现的发送短信消息案例。
首先,定义一个策略接口,描述发送消息的行为:
public interface MessageStrategy {
void sendMessage(String message, String recipient);
}
然后,创建实现MessageStrategy
接口的具体策略类,这里以发送短信为例:
public class SMSStrategy implements MessageStrategy {
@Override
public void sendMessage(String message, String recipient) {
// 模拟发送短信的逻辑
System.out.printf("Sending SMS to %s: %s%n", recipient, message);
}
}
接下来,定义一个上下文类,用于封装策略的使用,并在其中设置和执行策略:
public class MessageService {
private MessageStrategy strategy;
public MessageService(MessageStrategy strategy) {
this.strategy = strategy;
}
public void sendMessage(String message, String recipient) {
strategy.sendMessage(message, recipient);
}
}
最后,客户端代码可以根据需要选择并使用不同的策略来发送短信:
public class StrategyPatternDemo {
public static void main(String[] args) {
// 创建一个发送短信的策略实例
MessageStrategy smsStrategy = new SMSStrategy();
// 创建消息服务,传入短信发送策略
MessageService service = new MessageService(smsStrategy);
// 使用服务发送短信
service.sendMessage("Hello, this is a test SMS.", "+1234567890");
}
}
在这个例子中,MessageStrategy
接口定义了发送消息的策略,SMSStrategy
是具体发送短信的实现。MessageService
作为一个上下文,根据传入的策略执行对应的消息发送操作。客户端通过选择不同的策略实例,可以灵活地切换消息发送的方式,而无需修改消息服务的代码,这正是策略模式的优势所在。
具体案例二:
下面通过一个具体的案例来说明策略模式的应用:假设我们有一个鸭子模拟系统,鸭子可以有不同的叫声(呱呱叫、嘎嘎叫等),我们使用策略模式来动态改变鸭子的叫声行为。
首先,定义一个策略接口(DuckQuackBehavior):
public interface DuckQuackBehavior {
void quack();
}
然后,创建几个实现了该接口的具体策略类:
// 呱呱叫行为
public class Quack implements DuckQuackBehavior {
@Override
public void quack() {
System.out.println("呱呱叫");
}
}
// 嘎嘎叫行为
public class GagagaQuack implements DuckQuackBehavior {
@Override
public void quack() {
System.out.println("嘎嘎叫");
}
}
// 沉默不叫行为
public class Squeak implements DuckQuackBehavior {
@Override
public void quack() {
System.out.println("吱吱叫");
}
}
接下来,定义鸭子的抽象类和具体鸭子类,鸭子类包含对策略的引用:
// 鸭子抽象类
public abstract class Duck {
protected DuckQuackBehavior quackBehavior;
public void setQuackBehavior(DuckQuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
public void performQuack() {
if (quackBehavior != null) {
quackBehavior.quack();
}
}
}
// 具体鸭子类
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack(); // 默认呱呱叫
}
}
public class RubberDuck extends Duck {
public RubberDuck() {
quackBehavior = new Squeak(); // 橡皮鸭吱吱叫
}
}
最后,在客户端代码中,我们可以根据需要动态改变鸭子的行为:
public class StrategyPatternDemo {
public static void main(String[] args) {
Duck mallardDuck = new MallardDuck();
mallardDuck.performQuack(); // 输出:呱呱叫
mallardDuck.setQuackBehavior(new GagagaQuack()); // 改变行为
mallardDuck.performQuack(); // 输出:嘎嘎叫
Duck rubberDuck = new RubberDuck();
rubberDuck.performQuack(); // 输出:吱吱叫
}
}
这个例子展示了如何使用策略模式让鸭子在运行时改变它们的叫声行为,体现了行为的可替换性和扩展性。
欢迎添加程序汪个人微信 itwang008 进粉丝群或围观朋友圈