您的位置:首页 > 其它

【设计模式-策略模式】

2018-04-22 23:15 274 查看
package com.dusty.boring.strategy._native.paymentstrategy;

/**
* <策略接口定义>
*
* @author: xiehongfei[humphreytes@gmail.com]
* @date: 2018年04月22日 22:11
* @version: V1.0
* @review: xiehongfei[humphreytes@gmail.com]/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[humphreytes@gmail.com]
* @date: 2018年04月22日 22:28
* @version: V1.0
* @review: xiehongfei[humphreytes@gmail.com]/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[humphreytes@gmail.com]
* @date: 2018年04月22日 22:13
* @version: V1.0
* @review: xiehongfei[humphreytes@gmail.com]/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[humphreytes@gmail.com]
* @date: 2018年04月22日 22:16
* @version: V1.0
* @review: xiehongfei[humphreytes@gmail.com]/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[humphreytes@gmail.com]
* @date: 2018年04月22日 22:53
* @version: V1.0
* @review: xiehongfei[humphreytes@gmail.com]/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[humphreytes@gmail.com]
* @date: 2018年04月22日 22:27
* @version: V1.0
* @review: xiehongfei[humphreytes@gmail.com]/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[humphreytes@gmail.com]
* @date: 2018年04月22日 22:13
* @version: V1.0
* @review: xiehongfei[humphreytes@gmail.com]/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[humphreytes@gmail.com]
* @date: 2018年04月22日 22:22
* @version: V1.0
* @review: xiehongfei[humphreytes@gmail.com]/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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式