行为型设计模式目的是将多个类或对象相互协作,以及怎样合理分配职责,共同完成单个类或对象无法单独完成的任务。
在GoF中行为型设计模式有:解释器模式、模板方法模式、责任链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、访问者模式共11种。
策略模式(Strategy Pattern):策略模式将定义的一系列算法单独封装起来,让它们之间可以相互替换,并且算法的变化不会影响使用算法的用户;
策略模式的核心就是使用继承和多态,从而实现同一种行为在不同的场景下具备不同的实现(算法),达到不同的功能;
策略设计模式中主要包含3个角色:
【案例】
在网站登录时,很多网站都会提供多种登录方式,如QQ、微信、微博等登录方式。不管是哪种登录方式其根本都是登录成功后获取用户的一些认证信息,来识别该用户;
package com.pattern.demo01_策略模式的实现;
/**
* @author lscl
* @version 1.0
* @intro: 抽象策略角色,用于规范策略
*/
public interface ILoginStrategy {
void login();
}
package com.pattern.demo01_策略模式的实现;
/**
* @author lscl
* @version 1.0
* @intro: 策略算法的实现(具体策略)
*/
public class QQLoginStrategy implements ILoginStrategy{
@Override
public void login() {
System.out.println("采用QQ登录....");
}
}
package com.pattern.demo01_策略模式的实现;
/**
* @author lscl
* @version 1.0
* @intro: 策略算法的实现(具体策略)
*/
public class WxLoginStrategy implements ILoginStrategy{
@Override
public void login() {
System.out.println("采用微信登录....");
}
}
package com.pattern.demo01_策略模式的实现;
/**
* @author lscl
* @version 1.0
* @intro: 策略算法的实现(具体策略)
*/
public class WeiBoLoginStrategy implements ILoginStrategy {
@Override
public void login() {
System.out.println("采用微博登录");
}
}
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("登录成功");
}
}