学习、梳理设计模式。
策略模式
由策略接口、多个具体的策略实现、上下文组成。由客户端来选择具体的策略实现。
一个背景,CRM系统内有多种帐号体系:手机号注册的客户、微信授权的客户、微博授权的客户。
一个场景,需要把这些不同帐号体系的ID转换为CRM系统内部的统一UserId。
策略接口及实现
策略接口
public interface UserStrategy {
long transform2UserId(String origin);
}
手机号客户实现
public class MobileUserStrategy implements UserStrategy {
@Override
public long transform2UserId(String origin) {
return 1L;
}
}
微信客户实现
public class OpenIdUserStrategy implements UserStrategy {
@Override
public long transform2UserId(String origin) {
return 3L;
}
}
微博客户实现
public class WeiBoIdUserStrategy implements UserStrategy {
@Override
public long transform2UserId(String origin) {
return 2L;
}
}
上下文
public class UserContext {
private UserStrategy userStrategy;
public UserContext(UserStrategy userStrategy) {
this.userStrategy = userStrategy;
}
public long getUserId(String p) {
return this.userStrategy.transform2UserId(p);
}
}
客户端
选择权在客户端手中,由客户端来选择具体的实现类,并从上下文中
我们来测试一把
public class ClientTest {
public static void main(String[] args) {
//手机号客户
UserContext ctx = new UserContext(new MobileUserStrategy());
System.out.println(ctx.getUserId("13800138000"));
//微信OPENID客户
UserContext ctx1 = new UserContext(new OpenIdUserStrategy());
System.out.println(ctx1.getUserId("ONdasdarRAA"));
//微博客户
UserContext ctx2 = new UserContext(new WeiBoIdUserStrategy());
System.out.println(ctx2.getUserId("42"));
}
}
输出
1
3
2