策略模式
系统动态的在几种算法中选择一种来使用。
上图,Strategy是一个接口,ConcreteStrategyA,ConcreteStrategyB,ConcreteStrategyC都实现了Strategy接口,但是实现的策略是不同的。这符合了开闭原则(对修改关闭,对扩展开放),Context用来接收Strategy的策略实现类,Context和Strategy是聚合关系。
代码如下:
定义策略接口
package com.dl.pattern.strategy2;
/**
* 先定义策略,面向接口,开闭原则
*/
public interface Strategy {
double getPrice(double standaradPrice);
}
第一种策略算法
/**
* 普通会员策略
*/
public class Vip0Strategy implements Strategy {
@Override
public double getPrice(double standaradPrice) {
System.out.println("普通会员,原价"+standaradPrice);
return standaradPrice;
}
}
第二种策略算法
public class Vip1Strategy implements Strategy {
@Override
public double getPrice(double standaradPrice) {
System.out.println("一级会员,打九折"+standaradPrice*0.9);
return standaradPrice*0.9;
}
}
第三种策略算法
public class Vip2Strategy implements Strategy {
@Override
public double getPrice(double standaradPrice) {
System.out.println("二级会员,打八折"+standaradPrice*0.8);
return standaradPrice*0.8;
}
}
策略接受器
/**
* 策略接收器,专门接收策略实现的算法
* 负责和具体的策略类交互
*/
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy=strategy;
}
public double getReultPrice(double price){
return this.strategy.getPrice(price);
}
}
测试类
public class Client {
public static void main(String[] args) {
System.out.println("=========使用策略===========");
Context context=new Context(new Vip1Strategy());
double b = context.getReultPrice(1000);
System.out.println(b);
}
}
扫码进入大牛技术群。