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设计模式行为型模式:状态模式的主要内容,如果未能解决你的问题,请参考以下文章