package com.demo;
import java.lang.reflect.Constructor;
public class Client {
public static void main(String[] args) {
//不使用策略模式
Meidun meidun=new Meidun(5);
meidun.pay();
//使用策略模式
PinDaoDao pinDaoDao=new PinDaoDao(new HalfDisCount());
pinDaoDao.pay();
//使用反射优化策略模式
PinDaoDao pinDaoDaoBetter=new PinDaoDao("com.demo.OneDisCount");
pinDaoDaoBetter.pay();
}
}
class Meidun{
int discount;
public Meidun(int discount){
this.discount=discount;
}
public void pay(){
if(discount==1){
System.out.println("打一折");
}else if(discount==5){
System.out.println("打五折");
}else if(discount==8){
System.out.println("打八折");
}else {
System.out.println("打全折");
}
}
}
class PinDaoDao{
private DisCount disCount;
public PinDaoDao(DisCount disCount){
this.disCount=disCount;
}
public PinDaoDao(String classPath){
try {
Class clazz = Class.forName(classPath);
Constructor constructor = clazz.getDeclaredConstructor();
this.disCount = (DisCount) constructor.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
public void pay(){
disCount.payWithDisCount();
}
}
interface DisCount{
void payWithDisCount();
}
class HalfDisCount implements DisCount{
@Override
public void payWithDisCount() {
System.out.println("五百万的龟苓膏打五折就是二十五万");
}
}
class OneDisCount implements DisCount{
@Override
public void payWithDisCount() {
System.out.println("三百万的老残酸菜面打一折就是三百五十万");
}
}
从上面的例子来看,如果是不通过策略模式来进行pay操作,我们可以通过传入的参数来依次判断是打多少折,如果20种商品对应20种折头,我们就要写20个if...else操作,程序就要经过20次的判断.可能你会觉得20次的判断对性能影响不大,当时如果当判断次数达到上万级别,你还会愿意去等待程序进行判断吗?而我们的策略模式就是完全不用经过判断,就可以让程序来执行我们想要执行的代码.
策略模式
1.定义:定义一组算法,将每一个算法封装起来,从而使它们可以相互切换.
2.特点:
1)一组算法,那就是不同的策略.
2)这组算法都有相同的父类或者实现了相同的接口,目的是为了可以相互切换.
3.角色:
1)封装角色:上层访问策略的入口,它持有抽象策略角色的引用.(PinDaoDao类)
2)抽象策略角色:提供接口或者抽象类,定义策略组必须拥有的方法和属性.(DicCount接口)
3)具体策略角色:实现抽象策略,定义具体的算法逻辑.(HalfDiscount类和OneDiscount类)
优点:
1.策略模式提供了管理相关的算法族的办法.策略类的等级结构定义了一个算法或行为族.恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复
2.使用策略模式可以避免使用多重条件(if-else)语句.多重条件语句不易维护,它把采取哪一种算法或哪一种行为的逻辑与算法或行为的逻辑混合在一起,全部列在一个多条件语句里面,比使用继承的办法还要原始和落后
缺点:
1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类/这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类.换言之,策略模式只适用于客户端知道算法或行为的情况
2.由于策略模式把每个具体的策略实现都单独封装成类,如果有上万的策略,那么就有对应的上万个类,容易造成类的数目过多.
你们有可能会问,前后端交互的web项目,是不是一个接口只能固定走一种打折方式,不同折扣的商品要走不同的接口.我在最后一个例子中,使用反射来优化一下这个策略模式,通过前端传过来的对应字符串,我们用反射动态加载对应的类,使得可以一个接口走不同的折扣方式.
原文:https://www.cnblogs.com/zhujianqiang/p/14710750.html