策略模式和工厂模式是两种常见的设计模式。策略模式的主要目的是根据不同的情况选择不同的算法或行为,而工厂模式的主要目的是封装对象的创建过程 。两者在设计思想上有着本质的区别,工厂模式解决的是“如何创建对象”的问题,而策略模式解决的是“如何选择行为”的问题 。,,在复杂的设计中,这两种模式可以结合使用,例如工厂模式可以创建不同的策略对象,提供给客户端使用。
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它们的客户端。
策略模式的主要目的是将一组行为封装到一系列可互换的策略类中,从而使它们可以相互替换,策略模式的核心思想是定义一个通用的接口,然后让具体的策略类实现这个接口,这样,客户端可以根据需要选择合适的策略类来执行相应的操作,而不需要关心具体实现了哪个策略类。
以下是一个简单的策略模式示例:
假设我们有一个购物系统,用户可以选择不同的支付方式进行支付,这里我们有三种支付方式:支付宝、微信支付和银行卡支付,我们可以将这些支付方式看作是不同的策略,而用户支付的过程就是调用这些策略的行为。
我们需要定义一个支付策略接口:
public interface PaymentStrategy { void pay(double amount); }
我们分别实现这三种支付方式的策略类:
1、支付宝支付策略:
public class AlipayStrategy implements PaymentStrategy { @Override public void pay(double amount) { System.out.println("使用支付宝支付:" + amount + "元"); } }
2、微信支付策略:
public class WechatPayStrategy implements PaymentStrategy { @Override public void pay(double amount) { System.out.println("使用微信支付:" + amount + "元"); } }
3、银行卡支付策略:
public class BankCardPayStrategy implements PaymentStrategy { @Override public void pay(double amount) { System.out.println("使用银行卡支付:" + amount + "元"); } }
我们在购物系统中使用策略模式:
public class ShoppingSystem { private PaymentStrategy paymentStrategy; public ShoppingSystem(PaymentStrategy paymentStrategy) { this.paymentStrategy = paymentStrategy; } public void setPaymentStrategy(PaymentStrategy paymentStrategy) { this.paymentStrategy = paymentStrategy; } public void buySomething(double amount) { paymentStrategy.pay(amount); } }
客户端代码如下:
public class Client { public static void main(String[] args) throws Exception { ShoppingSystem shoppingSystem = new ShoppingSystem(new AlipayStrategy()); // 默认使用支付宝支付方式进行支付 shoppingSystem.buySomething(100); // 输出:使用支付宝支付:100.0元 ; shoppingSystem.setPaymentStrategy(new WechatPayStrategy()); // 切换为微信支付方式进行支付 shoppingSystem.buySomething(200); // 输出:使用微信支付:200.0元;切换为微信支付方式进行支付:使用微信支付:200.0元;设置支付方式为null时不能调用pay方法,此处会抛空指针异常,如果要避免这种情况,可以在setPaymentStrategy方法中判断传入的参数是否为null,不为null才进行设置,如果为null,则不进行设置,在实际项目中,还可以根据业务需求对这种异常进行捕获和处理。