fundo
Tanto o modo de estratégia quanto o modo de cadeia de responsabilidade são modos comportamentais.O modo de estratégia é usado em pagamentos, login e outros cenários, e o modo de cadeia de responsabilidade é usado na verificação de login e na cadeia de canal de netty. Esses dois padrões de projeto podem ser usados em casos semelhantes na vida. O código a seguir é apenas para sua referência. Se houver algo errado, por favor, aponte, obrigado!
padrão de estratégia
Este caso usa login como exemplo
package com.example.strategy.strategy;
import java.util.Map;
public interface IStrategy {
void login(Map<String,String> param);
}
package com.example.strategy.strategy;
import java.util.Map;
public class AliLogin implements IStrategy{
@Override
public void login(Map<String, String> param) {
System.out.println("支付宝登录");
}
}
package com.example.strategy.strategy;
import java.util.Map;
public class QQLogin implements IStrategy{
@Override
public void login(Map<String, String> param) {
System.out.println("QQ登录");
}
}
package com.example.strategy.strategy;
import java.util.Map;
public class WechatLogin implements IStrategy{
@Override
public void login(Map<String, String> param) {
System.out.println("微信登录");
}
}
package com.example.strategy.strategy;
import java.util.HashMap;
import java.util.Map;
public class LoginStrategy {
public static final String ALI = "Ali";
public static final String QQ = "Qq";
public static final String WECHAT = "Wechat";
public static Map<String, IStrategy> loginWays = new HashMap<>();
static {
loginWays.put(ALI, new AliLogin());
loginWays.put(QQ, new QQLogin());
loginWays.put(WECHAT, new WechatLogin());
}
public static IStrategy getPay(String payWay){
return loginWays.get(payWay);
}
}
package com.example.strategy.strategy;
import java.util.HashMap;
import java.util.Map;
public class Member {
private String username;
private String password;
private String payWay;
public Member(String username, String password) {
this.username = username;
this.password = password;
}
public String login(String payWay) {
Map<String, String> param = new HashMap<>();
param.put("username",username);
param.put("password",password);
IStrategy iStrategy = LoginStrategy.getPay(payWay);
iStrategy.login(param);
return "登录成功";
}
}
package com.example.strategy.strategy;
public class StrategyPatternTest {
public static void main(String[] args) {
Member member = new Member("张三", "123456");
System.out.println(member.login(LoginStrategy.ALI));
}
}
modelo de cadeia de responsabilidade
Implementado usando coleção mais padrão de construtor
package com.example.strategy.chain;
public interface IChain {
boolean doHandler(Request request);
}
package com.example.strategy.chain;
public class Validatelegal implements IChain{
@Override
public boolean doHandler(Request request) {
System.out.println("省略实现。。。。。");
return true;
}
}
package com.example.strategy.chain;
public class ValidateNull implements IChain{
@Override
public boolean doHandler(Request request) {
if(request.getParam()==null){
System.out.println("属性为空!!");
return false;
}
return true;
}
}
package com.example.strategy.chain;
import java.util.*;
public class ValidateWhite implements IChain {
private List<String> whites = new ArrayList<>();
public ValidateWhite(List<String> whites) {
this.whites = whites;
}
public List<String> getWhites() {
return whites;
}
public void setWhites(List<String> whites) {
this.whites = whites;
}
@Override
public boolean doHandler(Request request) {
for (Map.Entry<String, Object> map : request.getParam().entrySet()) {
if (!whites.contains(map.getKey())) {
System.out.println("非白名单字段");
return false;
}
}
return true;
}
}
package com.example.strategy.chain;
import java.util.Map;
public class Request {
private Map<String,Object> param;
public Request(Map<String, Object> param) {
this.param = param;
}
public Map<String, Object> getParam() {
return param;
}
public void setParam(Map<String, Object> param) {
this.param = param;
}
}
package com.example.strategy.chain;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ChainPattern {
List<IChain> list = new ArrayList<>();
public void doHandler(Request request) {
Iterator<IChain> iterator = list.listIterator();
while (iterator.hasNext()) {
if(!iterator.next().doHandler(request)){
return;
}
}
}
}
package com.example.strategy.chain;
public class ChainPatternBuilder {
private ChainPattern chainPattern = new ChainPattern();
public ChainPatternBuilder addLast(IChain iChain) {
chainPattern.list.add(iChain);
return this;
}
public ChainPattern build() {
return chainPattern;
}
}
package com.example.strategy.chain;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ChainPatternTest {
public static void main(String[] args) {
List<String> whites=new ArrayList<>();
whites.add("name");
ChainPattern chainPattern = new ChainPatternBuilder()
.addLast(new Validatelegal())
.addLast(new ValidateNull())
.addLast(new ValidateWhite(whites)).build();
Map<String,Object> param=new HashMap();
chainPattern.doHandler(new Request(param));
}
}