设计模式の委派模式&策略模式

设计模式の委派模式&策略模式

委派模式

该模式非23种设计模式之中的一种,他的基本作用就是负责任务的调用和分配,下面我们就用工作种的场景用代码的方式来提现委派模式

老板给项目经理下达任务,项目经理给每个员工派发任务,等到员工完成工作后,项目经理再给老板汇报,

员工接口

public interface Employee {
    void doing(String something);
}

员工A

public class EmployeeA  implements Employee{
    @Override
    public void doing(String something) {
        System.out.println("员工A正在做" + something);
    }
}

员工B

public class EmployeeB implements Employee{
    @Override
    public void doing(String something) {
        System.out.println("员工B正在做" + something);
    }
}

上级领导

public class Leader implements Employee{
​
    private Map<String,Employee> targets = new HashMap<String,Employee>();
​
    public Leader() {
        targets.put("workA",new EmployeeA());
        targets.put("workB",new EmployeeB());
        //...
    }
​
    @Override
    public void doing(String something) {
        //领导根据工作划分给不同的员工,比如workA为开发 , workB为测试
        targets.get(something).doing(something);
    }
}

老板

public class Boss {
​
    /**
     * boss这里开始派活,他可以派活给任何人,可能有多个Leader和多个员工,但他们都实现了Employee 接口
     */
    public void command(String command,Leader leader){
        leader.doing(command);
    }
​
}

测试类

public class TestMain {
    public static void main(String[] args) {
        //派活给Leader
        new Boss().command("workA" , new Leader());
        new Boss().command("workB" , new Leader());
​
    }
}

策略模式

这里我们使用策略模式实现选择支付方式的业务场景,大家在我网上买东西的时候,现在打击垄断,各个电商平台都支持多种支付方式,比如我在某东上购买商品,此时可以选择微信支付、支付宝支付、白条支付、银联支付等

支付结果状态实体

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PayState {
    private int code;
    private String result;
    private String msg;
}

支付渠道顶层类

public abstract class Payment {
​
    //支付类型
    public abstract String getName();
    //查询余额
    public abstract double queryBalance(String uid);
​
    public PayState pay(String uid,double amount) {
        if(queryBalance(uid) < amount){
            return new PayState(500,"支付失败","余额不足");
        }
        return new PayState(200,"支付成功","支付金额:" + amount);
    }
​
}

支付宝支付实现

public class AliPay extends Payment{
    @Override
    public String getName() {
        return "支付宝";
    }
    @Override
    public double queryBalance(String uid) {
        return 1000;
    }
}

京东支付实现

public class JdPay extends Payment{
    @Override
    public String getName() {
        return "京东白条";
    }

    @Override
    public double queryBalance(String uid) {
        return 2000;
    }
}

银联支付实现

public class UnionPay extends Payment{
    @Override
    public String getName() {
        return "银联支付";
    }

    @Override
    public double queryBalance(String uid) {
        return 10000;
    }
}

微信支付实现

public class WeChatPay extends Payment{

    @Override
    public String getName() {
        return "微信支付";
    }

    @Override
    public double queryBalance(String uid) {
        return 500;
    }
}

支付策略管理类

public class PayStrategy {

    public static final String ALI_PAY = "AliPay";
    public static final String JD_PAY = "JdPay";
    public static final String UNION_PAY = "UnionPay";
    public static final String WECHAT_PAY = "WechatPay";
    public static final String DEFAULT_PAY = ALI_PAY;

    private static Map<String,Payment> payStrategy = new HashMap<String,Payment>();

    static {
        payStrategy.put(ALI_PAY,new AliPay());
        payStrategy.put(WECHAT_PAY,new WeChatPay());
        payStrategy.put(UNION_PAY,new UnionPay());
        payStrategy.put(JD_PAY,new JdPay());
        payStrategy.put(DEFAULT_PAY,new JdPay());
    }

    public static Payment get(String payKey){
        if(!payStrategy.containsKey(payKey)){
            return payStrategy.get(DEFAULT_PAY);
        }
        return payStrategy.get(payKey);
    }

}

订单类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Order {
    private String uid;
    private String orderId;
    private double amount;

    //在这就完美的适配了所有支付方式,不用在写switvh 或者if else
    public PayState pay(){
        return pay(PayStrategy.DEFAULT_PAY);
    }

    public PayState pay(String payKey){
        Payment payment = PayStrategy.get(payKey);
        System.out.println("欢迎使用" + payment.getName());
        System.out.println("本次交易金额为:" + amount + ",开始扣款...");
        return payment.pay(uid,amount);
    }
}

测试类

public class TestMain {
    public static void main(String[] args) {
        //创建订单完成
        Order order = new Order("12580", "20220308153222", 1200);

        //开始支付 ,选择支付方式,默认使用京东白条进行支付
	    //order.pay();
        //关于取何种支付方式,由前端传约定值给后台即可
        PayState payState = order.pay(PayStrategy.UNION_PAY);
        System.out.println(payState);
    }
}

//控制台
欢迎使用银联支付
本次交易金额为:1200.0,开始扣款...
PayState(code=200, result=支付成功, msg=支付金额:1200.0)

.

posted @ 2022-03-08 16:36  鞋破露脚尖儿  阅读(56)  评论(0编辑  收藏  举报