学习、梳理设计模式。

策略模式

由策略接口、多个具体的策略实现、上下文组成。由客户端来选择具体的策略实现。

一个背景,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