设计模式之策略模式简介说明
下文笔者讲述,我们日常开发常用的一种设计模式---策略模式,如下所示
策略模式简介
策略模式是一种面向对象设计模式
它允许程序在运行时选择算法的行为
这种模式使得可以定义一系列算法,并将每种算法封装起来
使它们可以相互替换,而不会影响到使用这些算法的客户端
策略模式中主要角色
抽象策略(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"));
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


