状态模式:以登录和未登录状态为例:
1.创建登录LoginContext
public class LoginContext {
//这里采用内部类形式创建对象单例
public LoginContext(){
}
public static LoginContext getInstance(){
return LoginHolder.INSTANCE;
}
private static class LoginHolder{
private static final LoginContext INSTANCE = new LoginContext();
}
private UserStatus mUserStatus;
/**
* 设置当前用户的状态
* @param userStatus
*/
public void setUserStatus(UserStatus userStatus){
this.mUserStatus = userStatus;
}
/**
* 用户行为
*/
public void forward(){
if (mUserStatus != null){
mUserStatus.forward();
}
}
public void commit(){
if (mUserStatus != null){
mUserStatus.commit();
}
}
}
2.创建用户可执行的状态接口
/**
* 用户可执行的状态
*/
public interface UserStatus {
public void forward();
public void commit();
}
3.创建用户登录状态实例(只有用户已经登录,实际行为方法调用才会执行)
/**
* 用户登录状态
*/
public class LoginStatus implements UserStatus {
@Override
public void forward() {
}
@Override
public void commit() {
}
}
4.创建用户未登录状态实例
/**
* 用户未登录状态
* 行为操作都会执行提示用户登录操作
*/
public class LogoutStatus implements UserStatus {
@Override
public void forward() {
}
@Override
public void commit() {
}
}
5.实际调用
//获取当前抽象状态实例
LoginContext mLoginContext = LoginContext.getInstance();
//设置当前用户登录状态
mLoginContext.setUserStatus(new LogoutStatus());
//执行用户行为
mLoginContext.forward();
责任链模式:
//定义抽象服务处理者
public abstract class ServiceHandler {
//定义两个抽象方法来确定实际对象的行为和属性
public abstract int level();
public abstract void handle(int size);
protected ServiceHandler nextHandler;
public final void handRequest(int size){
//如果当前需求等级小于服务限制等级,即代表当前服务可进行处理
//否则,交与下以等级服务来进行等级判断或是处理
if (size < level()){
handle(size);
}else{
if (nextHandler != null){
nextHandler.handRequest(size);
}
}
}
}
//normal ServiceHandler
public class NormalService extends ServiceHandler {
@Override
public int level() {
return 0;
}
@Override
public void handle(int size) {
//doSomething
}
}
//large ServiceHandler
public class LargeService extends ServiceHandler {
@Override
public int level() {
return 5;
}
@Override
public void handle(int size) {
//doSomething
}
}
//use
ServiceHandler serviceHandler = new NextMajor();
NormalService normalService = new NormalService();
LargeService largeService = new LargeService();
serviceHandler.nextHandler = normalService;
normalService.nextHandler = largeService;
serviceHandler.handRequest(3);