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();
    }
}

你可能感兴趣的:(Java,#,编码优化及技巧,java,spring)