策略模式:又叫算法簇模式,即定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户;
使用策略模式的好处:我们可以动态的改变对象的行为;
对于策略模式的设计原则:
把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为; 策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
策略模式使得算法可以在不影响到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用;
策略模式中有三个对象也可以叫做角色:
(1)环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2)抽象策略对象:它可由接口或抽象类来实现。
(3)具体策略对象:它封装了实现同不功能的不同算法。
利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。
策略模式的具体结构:
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
下面是一张示例图来解释设计模式结构:
这个模式涉及到三个角色:
● 环境(Context)角色:持有一个Strategy的引用。
● 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
● 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
应用场景:假设小编开了一家水果店,为了更好地销售,推出了办理会员购买水果优惠制:
·初级会员:打95折;
·中级会员:打9折;
·高级会员:打85折;
对于这个问题可以用策略模式来实现:
·环境角色:价格类
·抽象角色:折扣类
·具体策略角色:初级会员折扣类,中级会员折扣类,高级会员折扣类
价格类:
package indiv.dyf.Context;
import indiv.dyf.Strategy.MemberStrategy;
public class Price {
// 持有一个具体的策略对象
private MemberStrategy strategy;
// 传入一个具体的策略对象
public Price(MemberStrategy strategy) {
this.strategy=strategy;
}
public double cost(double fruitPrice) {
return this.strategy.salePrice(fruitPrice);
}
}
折扣类:
package indiv.dyf.Strategy;
/**
* 计算水果的价格
* @param fruitPrice
* 水果价格
* @return 计算出打折后的价格
*/
public interface MemberStrategy {
double salePrice(double fruitPrice);
}
初级会员折扣类:
package indiv.dyf.ConcreteStrategy;
import indiv.dyf.Strategy.MemberStrategy;
public class PrimaryPrice implements MemberStrategy {
@Override
public double salePrice(double fruitPrice) {
System.out.println("初级会员打95折");
return fruitPrice * 0.95;
}
}
中级会员的折扣类:
package indiv.dyf.ConcreteStrategy;
import indiv.dyf.Strategy.MemberStrategy;
public class MiddlePrice implements MemberStrategy {
@Override
public double salePrice(double fruitPrice) {
System.out.println("中级会员打9折");
return fruitPrice * 0.9;
}
}
高级会员的折扣类:
package indiv.dyf.ConcreteStrategy;
import indiv.dyf.Strategy.MemberStrategy;
public class SeniorPrice implements MemberStrategy {
@Override
public double salePrice(double fruitPrice) {
System.out.println("高级会员打85折");
return fruitPrice * 0.85;
}
}
实现类:
package indiv.dyf.demo;
import indiv.dyf.ConcreteStrategy.PrimaryPrice;
import indiv.dyf.Context.Price;
import indiv.dyf.Strategy.MemberStrategy;
public class Demo {
public static void main(String[] args) {
// 选择并创建需要使用的策略对象
MemberStrategy primary=new PrimaryPrice();
// 创建环境
Price p=new Price(primary);
// 计算价格
double cost=p.cost(50);
System.out.println("水果最终价格(初级会员):" + cost);
}
}