java-行为型模式-策略设计模式
策略模式概述
策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
为什么叫策略设计模式?
见名知意,这是在做开发时的一种规范,那我们的所有设计模式当然也遵循了这种规范。OK。策略是什么?即是解决某种问题的一种计划或者方案。
实例
需求:一家商店会有多种促销手段来进行价格上的优惠,从而得到不同的最终价格,我们使用策略模式来进行多种价格算法上的优惠。
代码整体结构如下
创建一个优惠方式的抽象类
package com.beyondli.strategy.commodity;
/**
* Created by beyondLi on 2017/6/2.
*/
public interface Discount {
/**
*
* @param price 传入价格
* @return 返回折扣后的价格
*/
Double getDiscountPrice(Double price);
}
创建两个具体优惠方案
方案A(打八折)
package com.beyondli.strategy.commodity.impl;
import com.beyondli.strategy.commodity.Discount;
/**
* Created by beyondLi on 2017/6/2.
* 折扣方案A(打八折)
*/
public class DiscountSchemeA implements Discount {
@Override
public Double getDiscountPrice(Double price) {
return price * 0.8;
}
}
方案B(满100-20)
package com.beyondli.strategy.commodity.impl;
import com.beyondli.strategy.commodity.Discount;
/**
* Created by beyondLi on 2017/6/2.
* 折扣方案B(满100减20)
*/
public class DiscountSchemeB implements Discount {
@Override
public Double getDiscountPrice(Double price) {
if (price >= 100) {
return price - 20;
} else {
return price;
}
}
}
创建properties配置文件(读取使用的优惠方案)
创建客户端(调用优惠方法)
package com.beyondli.strategy;
import com.beyondli.strategy.commodity.Discount;
import java.util.Properties;
/**
* Created by beyondLi on 2017/6/2.
*/
public class Client {
public static void main(String[] args) throws Exception {
//模拟传入的价格为200元
Double price = 200d;
//要选择的折扣方案(从properties配置文件中获取)
//不了解properties的也可以直接将way写死
Properties p = new Properties();
p.load(Client.class.getClassLoader().getResourceAsStream("discount.properties"));
//获取到方案名称
//或写死 例:String way = "DiscountSchemeA"
String way = (String) p.get("discount");
//拼接对应方案的路径获取字节码
String wayPath = "com.beyondli.strategy.commodity.impl." + way;
//通过反射创建对应的字节码文件
Discount discountWay = (Discount) Class.forName(wayPath).newInstance();
//调用具体的折扣方案
//使用折扣方案
Double discountPrice = discountWay.getDiscountPrice(price);
System.out.println("使用了" + way + "方案,折扣后的价格为:" + discountPrice);
}
}
通过以上代码即可根据properties配置文件中的不同方案名调用不同的具体优惠方法,当我需要添加新的优惠方案时,只需将实现了Discount抽象类的子类添加进去即可,不需要对其他任何代码进行变动。
总结
有些同学会对策略设计模式与工厂设计模式傻傻分不清,个人感觉,这两种设计模式一般是可以结合使用的,只是侧重点不同。工厂侧重的是创建对象,而策略侧重的是你具体的解决方案(例如上例中的Discount、DiscountSchemeA、DiscountSchemeB),对于策略模式而言,这三个文件才是其核心,而client以及properties个人感觉谈不上是策略模式的核心,只是为了体现出开闭原则的效果以及整体所期望的效果而添加,其实此demo可以说是策略模式的demo,也可以说是类似于工厂设计模式的demo。以上均为个人理解,如有不足或者错误,望指出,共同成长。

被折叠的 条评论
为什么被折叠?



