文章目录
十五、策略设计模式
15.1 行为型设计模式简介
行为型设计模式目的是将多个类或对象相互协作,以及怎样合理分配职责,共同完成单个类或对象无法单独完成的任务。
在GoF中行为型设计模式有:解释器模式、模板方法模式、责任链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、访问者模式共11种。
15.2 策略设计模式简介
15.2.1 策略设计模式概述
策略模式(Strategy Pattern):策略模式将定义的一系列算法单独封装起来,让它们之间可以相互替换,并且算法的变化不会影响使用算法的用户;
策略模式的核心就是使用继承和多态,从而实现同一种行为在不同的场景下具备不同的实现(算法),达到不同的功能;
15.2.2 策略设计模式的UML类图
策略设计模式中主要包含3个角色:
- 1)上下文角色(Context):用来操作具体策略的上下文环境,屏蔽高层模块(调用者)对策略算法本身的直接访问,解耦高层模块与具体策略算法;
- 2)抽象策略角色(IStrategy):规范策略或算法的行为;
- 3)具体策略角色(Concrete Strategy):实现了抽象策略,提供具体的策略(算法)
15.3 策略设计模式的实现
【案例】
在网站登录时,很多网站都会提供多种登录方式,如QQ、微信、微博等登录方式。不管是哪种登录方式其根本都是登录成功后获取用户的一些认证信息,来识别该用户;
- 1)设计抽象角色(IStrategy):登录功能的规范定义
package com.pattern.demo01_策略模式的实现;
/**
* @author lscl
* @version 1.0
* @intro: 抽象策略角色,用于规范策略
*/
public interface ILoginStrategy {
void login();
}
- 2)具体策略1-QQ登录(ConcreteStrategy):登录功能的实现者
package com.pattern.demo01_策略模式的实现;
/**
* @author lscl
* @version 1.0
* @intro: 策略算法的实现(具体策略)
*/
public class QQLoginStrategy implements ILoginStrategy{
@Override
public void login() {
System.out.println("采用QQ登录....");
}
}
- 3)具体策略2-微信登录(ConcreteStrategy):登录功能的实现者
package com.pattern.demo01_策略模式的实现;
/**
* @author lscl
* @version 1.0
* @intro: 策略算法的实现(具体策略)
*/
public class WxLoginStrategy implements ILoginStrategy{
@Override
public void login() {
System.out.println("采用微信登录....");
}
}
- 4)具体策略3-微博登录(ConcreteStrategy):登录功能的实现者
package com.pattern.demo01_策略模式的实现;
/**
* @author lscl
* @version 1.0
* @intro: 策略算法的实现(具体策略)
*/
public class WeiBoLoginStrategy implements ILoginStrategy {
@Override
public void login() {
System.out.println("采用微博登录");
}
}
- 5)上下文对象(Context):登录功能操作者
package com.pattern.demo01_策略模式的实现;
/**
* @author lscl
* @version 1.0
* @intro: 策略的执行者,
*/
public class LoginExecute {
private ILoginStrategy strategy;
public LoginExecute(ILoginStrategy strategy) {
this.strategy = strategy;
}
// 执行策略
public void execute() {
System.out.println("打开网页");
try {
strategy.login();
} catch (Exception e) {
throw new RuntimeException("登录失败!");
}
System.out.println("登录成功");
}
}
15.4 策略模式的优缺点
- 优点:
- 符合开闭原则,扩展性强,可以轻松更换策略类,实现不同的功能
- 缺点:
- 客户端必须知道所有的策略,并且自行决定使用哪一个策略类
- 使用策略模式将会产生很多的策略类,增加维护难度