设计模式之--策略模式

概述

策略模式(Strategy Pattern),指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。定义了一组算法,将算法的实现封装到策略类中,彼此之间可以相互替换,让算法可在不影响客户端的情况下发生改变,这种设计就是策略模式。

我们以邮件的发送来解释怎么使用策略模式

类图

示例

策略接口MailStrategyService.java

public interface MailStrategyService {
    /**
     * 
     * 策略名称
     * @return
     */
    public String getStrategyName();

    /**
     * 策略的业务代码
     * @param type 
     */
    public void send(String message);

}
QQ邮件发送实现QQMailStrategyServiceImpl.java
@Service
@Slf4j
public class QQMailStrategyServiceImpl  implements MailStrategyService {
    @Override
    public String getStrategyName() {
        return "qq";
    }

    @Override
    public void send(String message) {
        System.out.println("正在向qq邮箱发送邮件:"+message);
    }
}

Souhu邮件发送实现SouhuMailStrategyServiceImpl.java

@Service
@Slf4j
public class SouhuMailStrategyServiceImpl implements MailStrategyService {
    @Override
    public String getStrategyName() {
        return "souhu";
    }

    @Override
    public void send(String message) {
        System.out.println("正在向搜狐邮箱发送邮件:"+message);
    }
}

Yahoo邮件发送实现YahooMailStrategyServiceImpl.java

@Service
@Slf4j
public class YahooMailStrategyServiceImpl implements MailStrategyService {
    @Override
    public String getStrategyName() {
        return "yahoo";
    }

    @Override
    public void send(String message) {
        System.out.println("正在向雅虎邮箱发送邮件:"+message);
    }
}

策略上下文MailStrategyContext.java

@Component
@Slf4j
@Setter
@Getter
public class MailStrategyContext implements InitializingBean, ApplicationContextAware {

    private final Map<String, MailStrategyService> strategy = new HashMap<>();

    private ApplicationContext applicationContext;

    /**
     * 根据策略名称获取策略类
     * @param strategyName
     * @return
     */
    public MailStrategyService getStrategy(String strategyName) {
        return strategy.get(strategyName);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        Map<String,MailStrategyService> map = applicationContext.getBeansOfType(MailStrategyService.class);
        map.forEach((key,value) -> {
            log.info("当前策略类:{}", value.getClass().getName());
            strategy.put(value.getServiceProviderName(), value);
        });
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}
邮件服务层MailService.java
@Service
public class MailService {
    @Autowired
    private MailStrategyContext mailStrategyContext;

    /**
     * 邮件发送伪代码
     * @param name
     * @param msg
     */
    public void send(String name,String msg){
        MailStrategyService mailStrategyService = mailStrategyContext.getStrategy(name);
        mailStrategyService.send(msg);
    }
}

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class Test {

    @Autowired
    private MailService strategyService;

    @org.junit.Test
    public void testMethod(){
        String msg="test";
        String type="qq";
        strategyService.send(type,msg);

        type="yahoo";
        strategyService.send(type,msg);

        type="souhu";
        strategyService.send(type,msg);
    }
}

 

1) 优秀的程序应该是这样的:阅读时,感觉很优雅;新增功能时,感觉很轻松;运行时,感觉很快速,这就需要设计模式支撑。<br /> <br /> 2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,但是不知道怎么使用到真实项目。本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 图解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解了设计模式,包括 设计模式七大原则、UML类图-类的六大关系、23种设计模式及其分类,比如 单例模式的8种实现方式、工厂模式的3种实现方式、适配器模式的3种实现、代理模式的3种方式、深拷贝等<br /> <br /> 3) 如果你想写出规范、漂亮的程序,就花时间来学习下设计模式吧<br /> <br /> 课程内容和目标<br /> <br /> 本课程是使用Java来讲解设计模式,考虑到设计模式比较抽象,授课采用 图解+框架源码分析的方式<br /> <br /> 1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种实现)、抽象工厂模式、原型模式、建造者模式、工厂模式。结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式策略模式、职责链模式(责任链模式)<br /> <br /> 2) 学习目标:通过学习,学员能掌握主流设计模式,规范编程风格,提高优化程序结构和效率的能力。<br /> <div> <br /> </div>
相关推荐
<div> <span style="font-size:16px;"><span><span style="font-size:20px;color:#FF0000;"><strong><span>课程亮点:</span></strong></span></span></span> </div> <div style="font-size:16px;"> <span style="color:#424242;"><span style="background-color:#FFFAA5;">课程培训详细的笔记以及实例代码,让学员开始掌握设计模式知识点</span></span> </div> <p style="font-size:16px;"> <span style="font-size:14px;"><span><span style="background-color:#FFFFFF;"><span style="color:#424242;"><br /></span></span></span></span> </p> <div> <div> <span style="font-size:16px;"><span><strong><span style="background-color:#FFFFFF;">课程内容:</span></strong></span></span> </div> <div> <ol><li> <span style="font-size:16px;color:#E53333;"><strong>工厂模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式、原型模型、代理模式、单例模式、适配器模式</strong></span> </li> <li> <span style="font-size:16px;color:#E53333;"><strong>策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式</strong></span> </li> </ol></div> </div> <div style="font-size:16px;"> <span style="color:#FF0000;"><strong><span style="font-size:18px;">课程特色:</span></strong></span> </div> <div> <ol><li> 笔记设计模式,用笔记串连所有知识点,让学员从一点一滴积累,学习过程无压力 </li> <li> 笔记标题采用关键字标识法,帮助学员更加容易记住知识点 </li> <li> 笔记以超链接形式让知识点关联起来,形式知识体系 </li> <li> 采用先概念后实例再应用方式,知识点深入浅出 </li> <li> <strong>提供授课内容笔记作为课后复习以及工作备查工具</strong> </li> </ol></div> <p> <span style="font-size:16px;"><span><span style="color:#00B050;"><strong><strong><span style="font-size:18px;">部分图表(电脑PC端查看):</span></strong></strong></span></span></span> </p> <p> <span style="font-size:16px;"><span><span style="color:#00B050;"><strong><strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/201905251242348850.png" alt="" /><img src="https://img-bss.csdn.net/201905251242404542.png" alt="" /><img src="https://img-bss.csdn.net/201905251242469204.png" alt="" /><img src="https://img-bss.csdn.net/201905251242514951.png" alt="" /><img src="https://img-bss.csdn.net/201905251243028561.png" alt="" /><br /></span></strong></strong></span></span></span> </p>
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页