翻翻代码无意中发现这个写法还挺有意思,整理下写个Demo发出来供大家一起玩耍~
大致原理就是通过Spring的@Component和@Autowired注解将策略Service自动装配到工厂中一个Map中,为了方便管理使用了一个策略类型的常量类(你也可以写成配置文件,我记得有些注解内是支持EL表达式的,请自行尝试),在工厂中把常量类的值传进来就可以通过Map定位到策略Service了。
不说废话了,直接上代码~
策略服务接口:
/**
* 送礼服务
*
* @author Wenx
* @date 2020/5/13
*/
public interface GiftService {
/**
* 派送礼物
*/
void sendGifts();
}
策略类型常量类:
/**
* 顾客类型常量类
*
* @author Wenx
* @date 2020/5/13
*/
public class CustomerConsts {
/**
* 喵星人
*/
public static final String CAT = "CAT";
/**
* 汪星人
*/
public static final String DOG = "DOG";
/**
* 小姐姐
*/
public static final String GIRL = "GIRL";
/**
* 大兄弟
*/
public static final String BOY = "BOY";
}
喵星人送礼服务:
/**
* 过节了给喵星人送点礼物
*
* @author Wenx
* @date 2020/5/13
*/
@Component(CustomerConsts.CAT)
public class CatGiftService implements GiftService {
@Override
public void sendGifts() {
System.out.println("美味的鱼让我吃了,给她点鱼刺好了~");
}
}
汪星人送礼服务:
/**
* 过节了给汪星人送点礼物
*
* @author Wenx
* @date 2020/5/13
*/
@Component(CustomerConsts.DOG)
public class DogGiftService implements GiftService {
@Override
public void sendGifts() {
System.out.println("大棒骨肉真多,忍不住酱了大棒骨吃,给他点骨头就好了~");
}
}
小姐姐送礼服务:
/**
* 过节了给小姐姐送点礼物
*
* @author Wenx
* @date 2020/5/13
*/
@Component(CustomerConsts.GIRL)
public class GirlGiftService implements GiftService {
@Override
public void sendGifts() {
System.out.println("也不知道小姐姐喜欢啥,把我自己送给她吧~");
}
}
大兄弟送礼服务:
/**
* 过节了给大兄弟送点礼物
*
* @author Wenx
* @date 2020/5/13
*/
@Component(CustomerConsts.BOY)
public class BoyGiftService implements GiftService {
@Override
public void sendGifts() {
System.out.println("我跟大兄弟这关系不送都行,可我还是得送,送他一脚吧~");
}
}
送礼服务工厂:
/**
* 送礼策略工厂,根据顾客类型选择响应送礼服务
*
* @author Wenx
* @date 2020/5/13
*/
@Component
public class GiftServiceFactory {
@Autowired
private Map<String, GiftService> giftServiceMap;
public GiftService getByCustomerType(String type) {
return giftServiceMap.get(type);
}
}
进行测试:
/**
* @author Wenx
* @date 2020/5/13
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = StudyDemoApplication.class)
public class GiftServiceFactoryTest {
@Autowired
private GiftServiceFactory giftServiceFactory;
@Test
public void getByCustomerType() {
GiftService giftService = giftServiceFactory.getByCustomerType(CustomerConsts.GIRL);
giftService.sendGifts();
}
}