Skip to main content

策略模式

策略模式是一种简单却常用的设计模式,它的应用场景非常广泛。我们先了解下策略模式的概念,再通过代码示例来更清晰的认识它。

策略模式的典型应用场景是表单校验中,对于校验规则的封装。接下来我们就通过一个简单的例子具体了解一下:

/**
* 登录控制器
*/
function LoginController() {
this.strategy = undefined;
this.setStrategy = function (strategy) {
this.strategy = strategy;
this.login = this.strategy.login;
}
}

/**
* 用户名、密码登录策略
*/
function LocalStragegy() {
this.login = ({ username, password }) => {
console.log(username, password);
// authenticating with username and password...
}
}

/**
* 手机号、验证码登录策略
*/
function PhoneStragety() {
this.login = ({ phone, verifyCode }) => {
console.log(phone, verifyCode);
// authenticating with hone and verifyCode...
}
}

/**
* 第三方社交登录策略
*/
function SocialStragety() {
this.login = ({ id, secret }) => {
console.log(id, secret);
// authenticating with id and secret...
}
}

// 登录控制器实例
const loginController = new LoginController();

//

// 调用用户名、密码登录接口,使用LocalStrategy
/*
app.use('/login/local', function (req, res) {
loginController.setStrategy(new LocalStragegy());
loginController.login(req.body);
});
*/
const useLocal = (req,res) => {
loginController.setStrategy(new LocalStragegy());
loginController.login(req.body);
}
const req = {
body:{
username:'xjn',
password:123456
}
}
const res = {}
useLocal(req,res)


// 调用手机、验证码登录接口,使用PhoneStrategy
/*
app.use('/login/phone', function (req, res) {
loginController.setStrategy(new PhoneStragety());
loginController.login(req.body);
});
*/
const usePhone = (req,res) => {
loginController.setStrategy(new PhoneStragety ());
loginController.login(req.body);
}
const req2 = {
body:{
phone :'150xxxx2539',
verifyCode :123456
}
}
const res2 = {}
usePhone(req2,res2)

// 调用社交登录接口,使用SocialStrategy
/*
app.use('/login/social', function (req, res) {
loginController.setStrategy(new SocialStragety());
loginController.login(req.body);
});
*/
const useSocial = (req,res) => {
loginController.setStrategy(new SocialStragety ());
loginController.login(req.body);
}
const req3 = {
body:{
id :'001',
secret :123456
}
}
const res3 = {}
useSocial(req3,res3)

从以上示例可以得出使用策略模式有以下优势:

  1. 方便在运行时切换算法和策略
  2. 代码更简洁,避免使用大量的条件判断
  3. 关注分离,每个 strategy 类控制自己的算法逻辑,strategy 和其使用者之间也相互独立