设计模式——14.策略模式strategy

报价场景:
客户买公司产品,市场部同事如何报价?假设产品定价998元每个。
如果是老客户大批量购买,定价85折
如果是老客户小批量购买,定价95折
如果是新客户大批量购买,定价9折
如果是新客户小批量购买,定价原价
一般程序员的思路

double getPrice(String type,double p){
	if(type是老客户大批量){
		return p* 0.85;
	}
	if(type是老客户小批量){
		return p* 0.95;
	}
	if(type是新客户大批量){
		return p* 0.9;
	}
	if(type是新客户小批量){
		return p;
	}
}

增加一种新的情况,信用低客户小,大批量,不卖…需要加代码,违背了开闭原则,对于新功能,只扩展,不修改的原则。
策略模式
分离算法,选择实现。
策略接口,其中定义方法获取报价。
对于每一种算法,实现策略接口,报价方法具体不同。

上下文Context维护策略引用,调用者设置不同策略,后期可以通过反射写进配置文件里面,调用不同策略。

如果新增信用低客户小,大批量,不卖策略,增加实现策略接口的实现类两个。不用修改代码。

算法(解决问题的有限的,确定的,唯一的,正确的步骤集合)策略接口

package com.bjsxt.strategy;

public interface Strategy {
    double getPrice(double p);
}

算法1:

package com.bjsxt.strategy;

public class OldCustomerManyStrategy implements Strategy {
    @Override
    public double getPrice(double p) {
        System.out.println("老客户大批量-85折");
        return p*0.85;
    }
}

算法2:

package com.bjsxt.strategy;

public class OldCustomerFewStrategy implements Strategy {
    @Override
    public double getPrice(double p) {
        System.out.println("老客户小批量-95折");return p*0.95;
    }
}

算法3:

package com.bjsxt.strategy;

public class NewCustomerManyStrategy implements Strategy {
    @Override
    public double getPrice(double p) {
        System.out.println("新客户大批量-9折");return p*0.9;
    }
}

算法4:

package com.bjsxt.strategy;

public class NewCustomerFewStrategy implements Strategy {
    @Override
    public double getPrice(double p) {
        System.out.println("新客户小批量-原价");return p;
    }
}

上下文,维护策略接口引用

package com.bjsxt.strategy;

public class Context {
    Strategy strategy;

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public double getPrice(double p){
        System.out.println("原价:"+p);
        return strategy.getPrice(p);
    }
}

调用者

package com.bjsxt.strategy;

public class Client {
    public static void main(String[] args) {
        Context c = new Context(new OldCustomerManyStrategy());
        System.out.println("报价"+c.getPrice(899));

        Context c2 = new Context(new OldCustomerFewStrategy());
        System.out.println("报价"+c2.getPrice(899));
    }
}

uml图
在这里插入图片描述
运行结果:
在这里插入图片描述
策略模式
– 策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族 中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新 的算法。并且由客户端决定调用哪个算法。
本质:
– 分离算法,选择实现。
• 开发中常见的场景:
– JAVASE中GUI编程中,布局管理
– Spring框架中,Resource接口,资源访问策略
– javax.servlet.http.HttpServlet#service()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值