【设计模式-策略模式】

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

猜你喜欢

转载自my.oschina.net/xiehongfei/blog/1799420