设计模式之策略模式简介说明
下文笔者讲述,我们日常开发常用的一种设计模式---策略模式,如下所示
策略模式简介
策略模式是一种面向对象设计模式 它允许程序在运行时选择算法的行为 这种模式使得可以定义一系列算法,并将每种算法封装起来 使它们可以相互替换,而不会影响到使用这些算法的客户端
策略模式中主要角色
抽象策略(Strategy)类: 定义一个公共接口 各种不同的算法以不同的方式实现这个接口 环境角色使用这个接口调用不同的算法 一般使用接口或抽象类实现。 具体策略(Concrete Strategy)类: 实现抽象策略定义的接口 提供具体的算法实现 环境(Context)类: 持有一个策略类的引用 最终给客户端调用。
策略模式的应用场景
1.支付系统: 如上面的示例所示 不同的支付方式可以作为不同的策略 2.排序算法: 根据不同的需求选择不同的排序算法 如 快速排序、归并排序等 3.游戏AI: 不同的AI行为可以作为不同的策略 如: 攻击策略、防守策略等。 4.文件压缩: 不同的压缩算法可以作为不同的策略,如ZIP、RAR等。 策略模式经常用于替换复杂的if else 语句 在日常开发中,被大量的使用例:为系统定义不同的支付方式
1.定义策略接口 public interface PaymentStrategy { void pay(int amount); } 2.实现具体的策略类 public class CreditCardPayment implements PaymentStrategy { private String cardNumber; private String name; private String cvv; private String dateOfExpiry; public CreditCardPayment(String nm, String ccNum, String cvv, String expiryDate){ this.cardNumber = ccNum; this.name = nm; this.cvv = cvv; this.dateOfExpiry = expiryDate; } @Override public void pay(int amount) { System.out.println(amount + " paid with credit/debit card"); } } public class PayPalPayment implements PaymentStrategy { private String emailId; private String password; public PayPalPayment(String email, String pwd){ this.emailId = email; this.password = pwd; } @Override public void pay(int amount) { System.out.println(amount + " paid using PayPal."); } } 3.创建上下文类 public class ShoppingCart { private list<Item> items; public ShoppingCart(){ this.items = new ArrayList<Item>(); } public void addItem(Item item){ this.items.add(item); } public void removeItem(Item item){ this.items.remove(item); } public int calculateTotal(){ int sum = 0; for(Item item : items){ sum += item.getPrice(); } return sum; } public void pay(PaymentStrategy paymentMethod){ int amount = calculateTotal(); paymentMethod.pay(amount); } } 4.使用策略模式 public class ShoppingCartTest { public static void main(String[] args) { ShoppingCart cart = new ShoppingCart(); Item item1 = new Item("1234",10); Item item2 = new Item("5678",40); cart.addItem(item1); cart.addItem(item2); // Pay by credit card cart.pay(new CreditCardPayment("maomao", "8232324242", "6666", "02/24")); // Pay by PayPal cart.pay(new PayPalPayment("admin@java265.com", "232323")); } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。