定义
它定义了算法家族,分别封装起来,让他们之间可以互相交换,此模式让算法的变化,不会影响到使用算法的用户
找出变化点,封装变化点是我们面向对象的一种重要的思维方式
应用场景
1.针对同一类型问题的多种处理方式,仅仅是具体行为有差别时;
2.需要安全地封装多种同一类型的操作时;
3.出现同一抽象类有多个子类,而又需要使用 if-else 或者 switch-case 来选择具体子类时。
4.需要在不同时间应用不同的的业务规则
实例
1模板:
Strategy类,定义所有支持的算法的公共接口
//抽象算法类
public interface Strategy {
//算法方法
public abstract void algorithmInterface();
}
ConcreteStrategy封装具体的算法或行为,继承于Strategy
public class ConcreteStrategyC implements Strategy {
@Override
public void algorithmInterface() {
System.out.println("===========算法C=============");
}
}
================================================================================
public class ConcreteStrategyB implements Strategy {
@Override
public void algorithmInterface() {
System.out.println("===========算法B=============");
}
}
==================================================================================
public class ConcreteStrategyA implements Strategy {
@Override
public void algorithmInterface() {
System.out.println("===========算法A=============");
}
}
Context
//上下文
public class Context {
Strategy strategy;
//初始化是传入的具体的策略对象
public Context(Strategy strategy) {
this.strategy = strategy;
}
//上下文接口
public void ContextInterface(){
strategy.algorithmInterface();
}
}
客户端
//客户端
public class Main {
public static void mian(String args[]){
Context context;
context = new Context(new ConcreteStrategyA());//实例化不同的对象
context.ContextInterface();
}
}
2.商场不同优惠方式:1.正常收费 2.满300返100 3.打8折
//优惠方式接口类
public interface CashSuper {
public abstract double acceptCash(double money);
}
优惠实现
//正常收费
public class NormalCash implements CashSuper {
@Override
public double acceptCash(double money) {
return money;
}
}
===================================================================================
//打8折收费
public class DiscountCash implements CashSuper {
private double discount;//折扣
public DiscountCash(double discount) {//初始化时加上折扣
this.discount = discount;
}
@Override
public double acceptCash(double money) {
return money*discount;
}
}
======================================================================================
//返利
public class ReturnCash implements CashSuper {
private double returnCondition ;//返利条件
private double returnMoney;//返利金额
public ReturnCash(double returnCondition, double returnMoney) {
this.returnCondition = returnCondition;
this.returnMoney = returnMoney;
}
@Override
public double acceptCash(double money) {
double result=money;
if(money>returnCondition){
money=money-Math.floor(money/returnCondition)*returnMoney;
}
return money;
}
}
context实现优惠方式
import strategy.CashSuper;
import strategy.DiscountCash;
import strategy.NormalCash;
import strategy.ReturnCash;
public class CashContext {
CashSuper cashSuper;
//策略模式与工厂模式结合
public CashContext(String type) {
switch (type)
{
//正常收费
case "1":cashSuper=new NormalCash();break;
//打8折
case "2":cashSuper=new DiscountCash(0.8);break;
//满300减100
case "3":cashSuper=new ReturnCash(300,100);
}
}
public double GetResult(double money){
return cashSuper.acceptCash(money);
}
}
客户端
import java.util.Scanner;
public class Main {
public static void main(String args[]){
double total=0;
System.out.println("输入对应收费方式前的数字:\n1.正常收费\n2.打8折\n3.满300减100");
Scanner sc = new Scanner(System.in);
String type = sc.nextLine();
CashContext cashContext = new CashContext(type);
System.out.println("输入收费金额:");
double money = sc.nextInt();
total = cashContext.GetResult(money);
System.out.println(total);
}
}