设计模式(21)——Strategy (策略)

什么是Strategy策略?

Strategy策略是定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化。策略模式的主要目的是隔离算法。



Strategy策略的适用范围

许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法
需要使用一个算法的不同变体。
算法使用了客户不应该知道的数据。
一个类定义了多种行为,这些行为以条件语句的形式初夏,可以把相关的条件分支移入它们各自的Strategy类中,以代替这些条件语句。

具体的应用场合比如,打电话的时候,晚上通话的话话费打折,平时不打折,可以定义为不同的策略。

Strategy策略的示例

下面以时间不同,价格不同为例说明Strategy模式
import java.util.ArrayList;
import java.util.List;
 
 
 // Sample Strategy design pattern
public class JavaApplication8 {
    public static void main(String[] args){
        Customer a = new Customer();
        a.setStrategy(new NormalStrategy());
 
        // Normal billing
        a.add(1.2,1);
 
        // Start Happy Hour
        a.setStrategy(new HappyHourStrategy());
        a.add(1.2,2);
 
        // New Customer
        Customer b = new Customer();
        b.setStrategy(new HappyHourStrategy());
        b.add(0.8,1);
        // The Customer Pays
        a.printBill();
 
        // End Happy Hour    
        b.setStrategy(new NormalStrategy());
        b.add(1.3,2);
        b.add(2.5,1);
        b.printBill();
 
    }
}
 
class Customer{
    private List<Double> drinks;
    private BillingStrategy strategy;
 
    public Customer() {
        this.drinks = new ArrayList<Double>();
    }
 
     // Add items to tab
    public void add(double price, int quantity){
        drinks.add(price*quantity);
    }
 
     // Payment of bill
    public void printBill(){
        System.out.println("Total due: " + strategy.sum(drinks));
        drinks.clear();
    }
 
     // Set Strategy
    public void setStrategy(BillingStrategy strategy) {
        this.strategy = strategy;
    }
 
}
 
interface BillingStrategy{
     // Return total price of drinks consumed
    public double sum(List<Double> drinks);
}
 
// Normal billing strategy (unchanged price)
class NormalStrategy implements BillingStrategy{
    public double sum(List<Double> drinks) {
        double sum = 0;
        for(Double i : drinks){
            sum += i;
        }
        return sum;
    }
}
 
 // Strategy for Happy hour (10% discount)
class HappyHourStrategy implements BillingStrategy{
    public double sum(List<Double> drinks) {
        double sum = 0;
        for(Double i : drinks){
            sum += i;
        }
        return sum*0.9;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值