主要解决一个什么问题
比如有个方法
public void sayHello(String type){if (type.equals("xiaoji")) {System.out.println("小鸡叫");}else if (type.equals("yazi")) {System.out.println("鸭子叫");}
}
这个代码有什么问题?如果后面要再加一个猪叫,是不是又要加一个if
,这样不利于扩展
策略模式
一个接口,策略模式一般定义2个方法,一个用于批评类型,一个是具体的实现方法
public interface AnimalService {void sayHello();String getType();
}
小鸡实现类
@Service
public class XiaojiServiceImpl implements AnimalService {@Overridepublic void sayHello() {System.out.println("小鸡叫");}@Overridepublic String getType() {return "xiaoji";}
}
鸭子实现类
@Service
public class YaziServiceImpl implements AnimalService {@Overridepublic void sayHello() {System.out.println("鸭子叫");}@Overridepublic String getType() {return "yazi";}
}
策略方法类
@Component
public class AnimalStrategyServiceFactory implements ApplicationContextAware {private Map<String, AnimalService> map = new ConcurrentHashMap<>();@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {applicationContext.getBeansOfType(AnimalService.class).values().forEach(animal -> map.put(animal.getType(), animal));}public void sayHello(AnimalService animal){map.get(animal.getType()).sayHello();}public void sayHello(String type){if (type.equals("xiaoji")) {System.out.println("小鸡叫");}else if (type.equals("yazi")) {System.out.println("鸭子叫");}}
}
测试
@Test
void test() {AnimalService animal = new YaziServiceImpl();animalStrategyServiceFactory.sayHello(animal);
}
这种代码的好处是,如果以后要加个猪实现,是不需要修改代码的,即对修改关闭,对扩展开放。即开闭原则