策略模式
模式说明
结构
代码演示
package com.yukiyama.pattern.behavior;
/**
* 策略模式
*/
public class StrategyDemo {
public static void main(String[] args) {
// 声明收费具体策略类cash1,按85折收费
Cash cash1 = new CashDiscount(0.15);
// 声明收费具体策略cash2,正常收费
Cash cash2 = new CashNormal();
// 声明收费上下文,通过构造器初始化收费策略为cash1
CashContext cc1 = new CashContext(cash1);
// 声明收费上下文,通过构造器初始化收费策略为cash2
CashContext cc2 = new CashContext(cash2);
// 付款100,返回cash1策略的应收费用
double requestMoney1 = cc1.acceptCash(100);
// 输出“85.0”
System.out.println(requestMoney1);
// 付款100,返回cash1策略的应收费用,输出“100”
double requestMoney2 = cc2.acceptCash(100);
// 输出“100.0”
System.out.println(requestMoney2);
}
}
/**
* 抽象策略类
* 定义一个收款抽象方法acceptCash,入参是客户付款,返回应收费用
*/
abstract class Cash{
public abstract double acceptCash(double money);
}
/**
* 具体策略类
* 继承抽象策略类,实现具体策略。
* 下例是按原价收费。
*/
class CashNormal extends Cash{
@Override
public double acceptCash(double money) {
return money;
}
}
/**
* 具体策略类
* 下例是按折扣收费,折扣在声明具体Cash类时通过构造器传入并初始化。
*/
class CashDiscount extends Cash{
private double rate;
public CashDiscount(double discount) {
rate = 1.0 - discount;
}
@Override
public double acceptCash(double money) {
return money * rate;
}
}
/**
* 环境类(上下文类)
* 持有一个收费策略类,并通过有参构造器传入收费策略实例初始化。
* 维护一个收款方法,内部调用其所持有的具体收费策略的收款方法。
*/
class CashContext{
private Cash cash;
public CashContext(Cash cash) {
this.cash = cash;
}
public double acceptCash(double money) {
return cash.acceptCash(money);
}
}Last updated