设计模式の委派模式&策略模式
委派模式
该模式非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)