目的
就是能动态改变你策略的策略,我的理解就是这个了。
正常情况下,我们写好一个算法就无法改变了,除非重新写一个函数。
但是策略模式却可以动态的改变算法。
UML
效果
买入:3个商品买入:5个商品================================开始结账一共买入: 8个商品每个商品: 6元没有促销一共花费: 48.0元================================================================开始结账一共买入: 8个商品每个商品: 6元打五折一共花费: 24.0元================================================================开始结账一共买入: 8个商品每个商品: 6元倒闭不要钱了一共花费: 24.0元================================
完整代码
主要是通过子类继承同一个促销方案的父类,
然后将其他促销方案单作参数进行传递
public class main {// 促销方案父类public static class sales {public double calc(int num, int price) {return 0;}}public static class noSales extends sales {public double calc(int num, int price) {System.out.println("没有促销");return num*price;}}public static class helfSales extends sales {public double calc(int num, int price) {System.out.println("打五折");return num*price*0.5;}}public static class freeSales extends sales {public double calc(int num, int price) {System.out.println("倒闭不要钱了");return num*price*0.5;}}public static class Market{int commidityNum = 0;int commidityPrice = 6;sales algorithm = new sales();public Market() {// TODO Auto-generated constructor stub}public void buy(int num) {commidityNum += num;System.out.println("买入:"+ num + "个商品");}public double CheckeOut(sales sales) {algorithm = sales;double total = 0;System.out.println("================================");System.out.println("开始结账");System.out.println("一共买入: " + commidityNum+"个商品");System.out.println("每个商品: " + commidityPrice+"元");total = algorithm.calc(commidityNum, commidityPrice);System.out.println("一共花费: "+ total + "元");System.out.println("================================");return total;}}public static void main(String[] args) {sales TnoSales = new noSales();sales ThelfSales = new helfSales();sales TfreeSales = new freeSales();Market test = new Market();test.buy(3);test.buy(5);// 传入相应的方法,实现响应的功能test.CheckeOut(TnoSales);test.CheckeOut(ThelfSales);test.CheckeOut(TfreeSales);}}
