策略模式使用场景
策略模式:根据用户的需求处理数据时候需要对算法做出选择,固定的一些算法(不再发生变化的算法),扩展
客户本身他不知道采用什么算法去计算
一些常用的使用场景:
- 比较器
- 旅行路线
- 固定算法
- 买东西结算支付
策略模式实现
我们先做一个订单状态类:
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;
}
@Override
public String toString(){
return ("支付状态:[" + code + "]," + msg + ",交易详情:" + data);
}
}
然后来一个订单类:
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;
}
//这个参数,完全可以用Payment这个接口来代替
//为什么?
//完美地解决了switch的过程,不需要在代码逻辑中写switch了
//更不需要写if else if
public PayState pay(PayType payType){
return payType.get().pay(this.uid,this.amount);
}
}
枚举支付类型:
public enum PayType {
ALI_PAY(new AliPay()),
WECHAT_PAY(new WechatPay()),
UNION_PAY(new UnionPay()),
JD_PAY(new JDPay());
private Payment payment;
PayType(Payment payment){
this.payment = payment;
}
public Payment get(){return this.payment;}
}
支付渠道接口:
public interface Payment {
public PayState pay(String uid, double amount);
}
来几个不同的支付方式:
public class WechatPay implements Payment {
public PayState pay(String uid, double amount) {
System.out.println("欢迎使用微信支付");
System.out.println("直接从微信红包扣款");
return new PayState(200,"支付成功",amount);
}
}
再来一个:
public class AliPay implements Payment {
public PayState pay(String uid, double amount) {
System.out.println("欢迎使用支付宝");
System.out.println("查询账户余额,开始扣款");
return new PayState(200,"支付成功",amount);
}
}
还有呢:
public class JDPay implements Payment {
public PayState pay(String uid, double amount) {
System.out.println("欢迎使用京东白条");
System.out.println("查询账户余额,开始扣款");
return new PayState(200,"支付成功",amount);
}
}
再来一个:
public class UnionPay implements Payment {
public PayState pay(String uid, double amount) {
System.out.println("欢迎使用银联卡支付");
System.out.println("查询账户余额,开始扣款");
return new PayState(200,"支付成功",amount);
}
}
可以了,我们来测试:
public static void main(String[] args) {
//省略把商品添加到购物车,再从购物车下单
//直接从点单开始
Order order = new Order("1","20180311001000009",324.45);
//开始支付,选择微信支付、支付宝、银联卡、京东白条、财付通
//每个渠道它支付的具体算法是不一样的
//基本算法固定的
//这个值是在支付的时候才决定用哪个值
System.out.println(order.pay(PayType.WECHAT_PAY));
}
模板模式
1、以jdbcTemplate为例
public class JdbcTemplate {
private DataSource dataSource;
public JdbcTemplate(DataSource dataSource){
this.dataSource = dataSource;
}
private Connection getConnection() throws Exception{
return this.dataSource.getConnection();
}
private PreparedStatement createPreparedStatement(Connection conn,String sql) throws Exception{
return conn.prepareStatement(sql);
}
private ResultSet executeQuery(PreparedStatement pstmt,Object [] values) throws Exception{
for (int i = 0; i <values.length; i ++){
pstmt.setObject(i,values[i]);
}
return pstmt.executeQuery();
}
private void closeStatement(Statement stmt) throws Exception{
stmt.close();
}
private void closeResultSet(ResultSet rs) throws Exception{
rs.close();
}
private void closeConnection(Connection conn) throws Exception{
//通常把它放到连接池回收
}
private List<?> parseResultSet(ResultSet rs,RowMapper rowMapper) throws Exception{
List<Object> result = new ArrayList<Object>();
int rowNum = 1;
while (rs.next()){
result.add(rowMapper.mapRow(rs,rowNum ++));
}
return result;
}
public List<?> executeQuery(String sql,RowMapper<?> rowMapper,Object [] values){
try {
//1、获取连接
Connection conn = this.getConnection();
//2、创建语句集
PreparedStatement pstmt = this.createPreparedStatement(conn,sql);
//3、执行语句集,并且获得结果集
ResultSet rs = this.executeQuery(pstmt,values);
//4、解析语句集
List<?> result = this.parseResultSet(rs,rowMapper);
//5、关闭结果集
this.closeResultSet(rs);
//6、关闭语句集
this.closeStatement(pstmt);
//7、关闭连接
this.closeConnection(conn);
return result;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
2、然后做一个entity
@Data
public class Member {
private String username;
private String password;
private String nickName;
private int age;
private String addr;
}
3、mapper接口
public interface RowMapper<T> {
public T mapRow(ResultSet rs, int rowNum) throws Exception;
}
4、dao实现
public class MemberDao {
//为什么不继承,主要是为了解耦
private JdbcTemplate JdbcTemplate = new JdbcTemplate(null);
public List<?> query(){
String sql = "select * from t_member";
return JdbcTemplate.executeQuery(sql,new RowMapper<Member>(){
public Member mapRow(ResultSet rs, int rowNum) throws Exception {
Member member = new Member();
member.setUsername(rs.getString("username"));
member.setPassword(rs.getString("password"));
member.setAge(rs.getInt("age"));
member.setAddr(rs.getString("addr"));
return member;
}
},null);
}
}
5、我们来测试一下
public static void main(String[] args) {
MemberDao memberDao = new MemberDao();
memberDao.query();
}