博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之策略模式
阅读量:2403 次
发布时间:2019-05-10

本文共 2195 字,大约阅读时间需要 7 分钟。

1.策略模式使用场景

策略模式注重的是对算法的封装,用户不需要知道每个算法的实现细节,之需要给用户提供不同算法的选择权。例如支付场景支持支付宝、微信、银联、财付通,用户只需要从中选择一种方式进行支付即可。

使用策略模式可以减少代码中if-else判断逻辑,可以更好的进行扩展。

 

2.代码实现

定义策略接口类,及其实现类

import com.william.javacore.pattern.strategy.PayState;//策略接口类public interface Payment {	PayState pay(String uid, double amount);}import com.william.javacore.pattern.strategy.PayState;public class AliPay implements Payment {	    public PayState pay(String uid, double amount) {        System.out.println("欢迎使用支付宝");        System.out.println("查询账户余额,开始扣款");        return new PayState(200,"支付成功",amount);    }}import com.william.javacore.pattern.strategy.PayState;public class JDPay implements Payment {	public PayState pay(String uid, double amount) {		System.out.println("欢迎使用京东白条");        System.out.println("查询账户余额,开始扣款");        return new PayState(200,"支付成功",amount);	}}
package com.william.javacore.pattern.strategy;public class PayState {    private int code;    private Object data;    private String msg;    public PayState(int code, String msg,Object data) {        this.code = code;        this.data = data;        this.msg = msg;    }    public String toString(){        return ("支付状态:[" + code + "]," + msg + ",交易详情:" + data);    }}
import com.william.javacore.pattern.strategy.paytype.PayType;public class Order {    private String uid;    private String orderId;    private double amount;    public Order(String uid,String orderId,double amount){        this.uid = uid;        this.orderId = orderId;        this.amount = amount;    }    //payType这个参数,完全可以用Payment这个接口来代替    //那么需要将Payment作为一个成员变量,然后在有参构造函数中对Payment进行复制    public PayState pay(PayType payType){        return payType.get().pay(this.uid,this.amount);    }}

 测试:

import com.william.javacore.pattern.strategy.paytype.PayType;import java.util.ArrayList;import java.util.List;public class PayTest {		public static void main(String[] args) {				// 选购商品,点击订单支付		 Order order = new Order("1","2018120381489799722801",69.50);		 /**		  * 各种支付方式,支付算法已经提前封装好了,用户不需要关心算法的实现		  * 只需要做出适当的选择即可。		  */		 System.out.println(order.pay(PayType.ALI_PAY));		System.out.println(order.pay(PayType.JD_PAY));	}}

3.源码中的体现

例如Spring的aop实现中,当判断是使用jdk动态代理,还是使用cglib动态代理时,就是根据策略模式进行的。

转载地址:http://unpob.baihongyu.com/

你可能感兴趣的文章
信息安全与伪装技术(转)
查看>>
给Win2000减减肥(转)
查看>>
Windows个性化之稀奇古怪三两式(转)
查看>>
nt的19个秘密武器(转)
查看>>
别让IE和Office泄露了你的秘密(转)
查看>>
让Windows2000和WindwosXP和平共处(转)
查看>>
将回收站变成保密站(转)
查看>>
制作Windows2000启动的“机密钥匙”(转)
查看>>
小心防范最易被黑客盯上的注册表位置(转)
查看>>
用注册表对系统进行全方位维护和管理(转)
查看>>
修改注册表阻止OfficeXP发送错误报告(转)
查看>>
不再费时费力两招快速定位注册表项(转)
查看>>
Win2K无盘终端网组建全攻略(6)(转)
查看>>
星期四(转)
查看>>
重装WinXP前必须进行的十大备份(转)
查看>>
企业容灾备份机制的建立--未雨绸缪的选择(转)
查看>>
rundll32.exe命令使用大法(转)
查看>>
Java 独占锁|共享锁|互斥锁
查看>>
Java 爬虫入门
查看>>
设计模式|七大原则及案例分析
查看>>