1、策略模式(集成Spring应用方法)
打折类的问题
public interface CouponStrategy {
/**具体的打折实现**/
void discount();
/**对应的类型是否匹配**/
boolean isSupport(Integer status);
}
比如我们的折扣方式有满减和优惠券,此时我们需要定义两个实现类分别对应满减和优惠券
@Service(value = "0")
public class FullCutCoupon implements CouponStrategy {
@Override
public boolean isSupport(Integer status) {
// status 可以使用value
return status.equals(0);
}
@Override
public void discount() {
System.out.println("test0");
}
}
@Service(value = "1")
public class DiscountCoupon implements CouponStrategy {
@Override
public boolean isSupport(Integer status) {
return status.equals(1);
}
@Override
public void discount() {
System.out.println("test1");
}
}
通常来说为了上层调用的无感知我们会对整个上层进行一个包装
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@Service
public class CouponContext {
/**Spring注入的实现有两种形式,一种是map,value就是Service(“key”)**/
@Autowired
private Map<String, CouponStrategy> couponStrategyConcurrentHashMap;
public void selectStrategy(Integer status) {
CouponStrategy couponStrategy = couponStrategyConcurrentHashMap.get(String.valueOf(status));
if (!ObjectUtils.isEmpty(couponStrategy)) {
couponStrategy.discount();
}
}
@Autowired
private List<CouponStrategy> couponStrategyList;
public void findStrategy(Integer status) {
Optional<CouponStrategy> first = couponStrategyList.stream().filter(couponStrategy -> couponStrategy.isSupport(status)).findFirst();
if (first.isPresent()) {
first.get().discount();
}
}
}
此时我们可以模拟实现测试一下
@Service
public class TestService {
@Autowired
private CouponContext couponContext;
public void test(Integer status) {
couponContext.selectStrategy(status);
}
}
@SpringBootTest
class StrategyServiceApplicationTests {
@Autowired
private TestService testService;
@Test
void contextLoads() {
testService.test(0);
testService.test(1);
}
}