设计模式之策略模式 (七)

前面讲动态代理的时候有提到策略模式,在Spring中用到了两种代理方式,一个是JDK动态代理一个是CGLib代理,那到底Spring使用哪种代理创建代理呢?这里就用到了策略模式,由ProxyFactoryBean这个类来决定使用哪种策略,下面看看策略模式是怎么样的一个东西吧。

定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。


以上类图和定义来自百度百科

结合定义与类图我们可以知道,策略模式有一个策略接口(strategy),下面有许多策略实现类,分别都是不同的策略不同的算法,也就是定义上说的定义一系列算法,并把每一个算法封装起来,然后在Context类中根据具体情况选择不同的策略(算法),这样就可以做到算法独立于使用它的客户的变化而变化了。

这里举一个去商店消费的例子,全场7折,单笔购物满500元打6折,单笔购物满1000元打5折!下面上代码。

策略接口strategy(用于计算价格)

package test;

public interface strategy {

	public double calPrice(double price);

}

然后就是对策略接口的实现(三种折扣策略)

package test;

public class VIP1 implements strategy {

	@Override
	public double calPrice(double price) {
		return (price * 0.7);
	}

}
package test;

public class VIP2 implements strategy {

	@Override
	public double calPrice(double price) {
		return (price * 0.6);
	}

}
package test;

public class VIP3 implements strategy {

	@Override
	public double calPrice(double price) {
		return (price * 0.5);
	}

}

然后就是context类,这里是顾客类,根据上下文选择对应策略。

package test;

public class customer {

	strategy algorithm = new VIP1();

	String name;

	public customer(String name) {
		this.name = name;
	}

	public void buy(double price) {
		check(price);
		System.out.println(name + "购买了一件" + price + "元的商品,实收:" + algorithm.calPrice(price));

	}
	//根据单笔消费金额选择策略
	private void check(double price) {
		if(price > 500 && price < 1000) {
			algorithm = new VIP2();
		} else if(price > 1000) {
			algorithm = new VIP3();
		} else {
			algorithm = new VIP1();
		}
	}

}
来试一试吧
package test;

public class testA {
	public static void main(String[] args) {
		customer zhangsan = new customer("张三");
		zhangsan.buy(600);
		zhangsan.buy(1200);
		zhangsan.buy(200);

	}
}

控制台打印


写到这里,应该对策略模式有个大致的认识了,结合之前的类图就可以发现,它可以在context上下文环境根据具体的情况来选择对应的策略,从而达到对不同消费者有不同的计算实际金额的方式(打折)。

注:由于我的水平有限,有些地方说的可能有问题?欢迎大家指出,互相讨论互相学习进步!

猜你喜欢

转载自blog.csdn.net/qq_41737716/article/details/80540706