Spring框架实现策略模式+工厂模式小技巧

Spring框架实现策略模式+工厂模式小技巧

翻翻代码无意中发现这个写法还挺有意思,整理下写个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();
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值