Java设计模式行为型模式:状态模式

Posted hans774882968

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式行为型模式:状态模式相关的知识,希望对你有一定的参考价值。

场景

假设一个论坛有若干功能:发帖、发评论、看帖、看评论……每个功能都需要进行权限控制,区分当前用户是哪一级权限(角色)。最自然的做法我们都会,就是每个功能写一大堆if-else。它的问题是:可扩展性弱。假如新增一个权限(角色),需要把所有功能的代码都改一遍。

解决方案

  • 设计一个interface,叫做“状态”,所有功能各对应状态的一个抽象方法,等待子类实现。
  • 子类implements interface,每个子类表示一个权限(角色)。
  • 用户有一个属性state,表示它的角色。

你把功能想象成行,角色想象成列,于是最自然的做法对应着看到每个行。而状态模式对应着看到每个列。真可谓“横看成岭侧成峰”~

在迭代开发中,业务逻辑越来越复杂,从而不得不使用很多 if-else 语句来实现时,就可以考虑一下是不是可以用 状态模式 来重构,特别是一些有状态流程转换方面的业务。

参考:https://mp.weixin.qq.com/s/idqYPpzR8kbG4gz11EnY1Q

代码

package statePattern;

interface UserState 
    void login(String name);

    void sendBlog(String name);

    void sendComment(String name);

    void viewBlog(String name);

    void viewComment(String name);


class Visitor implements UserState 
    @Override
    public String toString() 
        return "游客";
    

    @Override
    public void login(String name) 
        System.out.println(name + "登录中");
    

    @Override
    public void sendBlog(String name) 
        System.out.println(name + "游客不允许发帖");
    

    @Override
    public void sendComment(String name) 
        System.out.println(name + "游客不允许发评论");
    

    @Override
    public void viewBlog(String name) 
        System.out.println(name + "游客不允许看帖");
    

    @Override
    public void viewComment(String name) 
        System.out.println(name + "游客不允许看评论");
    


class NormalUser implements UserState 
    @Override
    public String toString() 
        return "普通用户";
    

    @Override
    public void login(String name) 
        System.out.println(name + "不必登录");
    

    @Override
    public void sendBlog(String name) 
        System.out.println(name + "普通用户不允许发帖");
    

    @Override
    public void sendComment(String name) 
        System.out.println(name + "允许发评论");
    

    @Override
    public void viewBlog(String name) 
        System.out.println(name + "允许看帖");
    

    @Override
    public void viewComment(String name) 
        System.out.println(name + "允许看评论");
    


class SuperUser implements UserState 
    @Override
    public String toString() 
        return "权限狗";
    

    @Override
    public void login(String name) 
        System.out.println(name + "不必登录");
    

    @Override
    public void sendBlog(String name) 
        System.out.println(name + "允许发帖");
    

    @Override
    public void sendComment(String name) 
        System.out.println(name + "允许发评论");
    

    @Override
    public void viewBlog(String name) 
        System.out.println(name + "允许看帖");
    

    @Override
    public void viewComment(String name) 
        System.out.println(name + "允许看评论");
    


class User 
    private String name;
    private UserState state;

    User() 
        name = "匿名用户";
        state = new Visitor();
    

    User(String name) 
        this.name = name;
        state = new Visitor();
    

    User(String name, UserState state) 
        this.name = name;
        this.state = state;
    

    String getRole() 
        return state.toString();
    

    void login() 
        state.login(name);
    

    void sendBlog() 
        state.sendBlog(name);
    

    void sendComment() 
        state.sendComment(name);
    

    void viewBlog() 
        state.viewBlog(name);
    

    void viewComment() 
        state.viewComment(name);
    


public class SendBlogDemo 
    public static void main(String[] args) 
        User u1 = new User("hans0", new Visitor()),
            u2 = new User("hans1", new NormalUser()),
            u3 = new User("hans2", new SuperUser());
        System.out.println(u1.getRole() + " , " + u2.getRole() + " , " + u3.getRole());
        u1.login();
        u2.sendBlog();
        u2.sendComment();
        u3.sendBlog();
    

以上是关于Java设计模式行为型模式:状态模式的主要内容,如果未能解决你的问题,请参考以下文章

JAVA SCRIPT设计模式--行为型--设计模式之State状态者模式(20)

从零开始学习Java设计模式 | 行为型模式篇:状态模式

从零开始学习Java设计模式 | 行为型模式篇:状态模式

行为型模式之 状态模式

行为型模式之状态模式

跟我学Java设计模式第6天:行为型设计模式汇总源码