package com.dusty.boring.strategy._native.paymentstrategy;
/**
* <策略接口定义>
*
* @author: xiehongfei[[email protected]]
* @date: 2018年04月22日 22:11
* @version: V1.0
* @review: xiehongfei[[email protected]]/2018年04月22日 22:11
*/
public interface PaymentStrategy<T extends AbstractPaymentContext> {
/**
* 公司给某人真正支付工资
* @param ctx 支付工资的上下文,里面包含算法需要的数据
*/
public void pay(T ctx);
}
package com.dusty.boring.strategy._native.paymentstrategy;
import com.dusty.boring.strategy._native.Strategy;
import lombok.Getter;
import lombok.Setter;
/**
* <抽象策略上下文类>
* 支付工资
* 持有一种策略及上下文属性
* 定义抽象立即支付方法
*
* @author: xiehongfei[[email protected]]
* @date: 2018年04月22日 22:28
* @version: V1.0
* @review: xiehongfei[[email protected]]/2018年04月22日 22:28
*/
@Getter
@Setter
public abstract class AbstractPaymentContext {
/**
* 员工姓名
*/
private String employeeName;
/**
* 工资金额
*/
private double money = 0.00;
/**
* 工资支付策略
*/
private PaymentStrategy strategy;
public AbstractPaymentContext(String employeeName, double money, PaymentStrategy strategy){
this.employeeName = employeeName;
this.money = money;
this.strategy = strategy;
}
public abstract void payNow();
}
package com.dusty.boring.strategy._native.paymentstrategy;
/**
* <支付策略人民币支付工资策略>
*
* @author: xiehongfei[[email protected]]
* @date: 2018年04月22日 22:13
* @version: V1.0
* @review: xiehongfei[[email protected]]/2018年04月22日 22:13
*/
public class RMBCashPayStrategy implements PaymentStrategy<CashPaymentContext> {
@Override
public void pay(CashPaymentContext ctx) {
System.out.println("现在给" + ctx.getEmployeeName()
+ "支付人民币现金" + ctx.getMoney());
}
}
package com.dusty.boring.strategy._native.paymentstrategy;
/**
* <工资支付策略-美元支付>
*
* @author: xiehongfei[[email protected]]
* @date: 2018年04月22日 22:16
* @version: V1.0
* @review: xiehongfei[[email protected]]/2018年04月22日 22:16
*/
public class DollarCashStrategy implements PaymentStrategy<CashPaymentContext> {
@Override
public void pay(CashPaymentContext ctx) {
System.out.println("现在给" + ctx.getEmployeeName()
+ "支付美元现金" + ctx.getMoney());
}
}
package com.dusty.boring.strategy._native.paymentstrategy;
/**
* <卡支付策略>
*
* @author: xiehongfei[[email protected]]
* @date: 2018年04月22日 22:53
* @version: V1.0
* @review: xiehongfei[[email protected]]/2018年04月22日 22:53
*/
public class CardStrategy implements PaymentStrategy<CardPaymentContext> {
@Override
public void pay(CardPaymentContext ctx) {
System.out.println("支付给" + ctx.getEmployeeName()
+ "工资卡" + ctx.getBankCardNo() + "共计" + ctx.getMoney());
}
}
package com.dusty.boring.strategy._native.paymentstrategy;
import lombok.Getter;
import lombok.Setter;
/**
* <工资卡支付上下文>
*
* @author: xiehongfei[[email protected]]
* @date: 2018年04月22日 22:27
* @version: V1.0
* @review: xiehongfei[[email protected]]/2018年04月22日 22:27
*/
@Getter
@Setter
public class CardPaymentContext extends AbstractPaymentContext {
private String bankCardNo;
public CardPaymentContext(String employeeName, double money, String bankCardNo, PaymentStrategy strategy) {
super(employeeName, money, strategy);
this.bankCardNo = bankCardNo;
}
@Override
public void payNow() {
getStrategy().pay(this);
}
}
package com.dusty.boring.strategy._native.paymentstrategy;
import lombok.Getter;
/**
* <现金支付上下文>
*
* @author: xiehongfei[[email protected]]
* @date: 2018年04月22日 22:13
* @version: V1.0
* @review: xiehongfei[[email protected]]/2018年04月22日 22:13
*/
@Getter
public class CashPaymentContext extends AbstractPaymentContext {
public CashPaymentContext(String employeeName, double money, PaymentStrategy strategy) {
super(employeeName, money, strategy);
}
/**
* 立即支付工资
*/
@Override
public void payNow() {
super.getStrategy().pay(this);
}
}
package com.dusty.boring.strategy._native.paymentstrategy;
/**
* <策略代码测试>
*
* @author: xiehongfei[[email protected]]
* @date: 2018年04月22日 22:22
* @version: V1.0
* @review: xiehongfei[[email protected]]/2018年04月22日 22:22
*/
public class Client {
/**
* 测试入口方法
* @param args 参数
*/
public static void main(String... args) {
PaymentStrategy rmbPayStrategy = new RMBCashPayStrategy();
CashPaymentContext ctx = new CashPaymentContext("张三", 10000, rmbPayStrategy);
ctx.payNow();
PaymentStrategy dollarPayStrategy = new DollarCashStrategy();
CashPaymentContext ctx1 = new CashPaymentContext("李四", 4000, dollarPayStrategy);
ctx1.payNow();
PaymentStrategy cardPayStrategy = new CardStrategy();
CardPaymentContext ctx2 = new CardPaymentContext("王五",
5000, "1-001-008-990", cardPayStrategy);
ctx2.payNow();
}
}
##运行结果:
现在给张三支付人民币现金10000.0
现在给李四支付美元现金4000.0
支付给王五工资卡1-001-008-990共计5000.0