zoukankan      html  css  js  c++  java
  • Android实战设计模式-----状态模式

    定义:

    当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类

    使用使用场景:

    1.一个对象的行为取决于它的状态,并且它的状态必须在运行时根据状态改变它的行为

    2.代码中包含大量与对象状态有关的条件语句,例如,一个操作中含有庞大的多分支语句 if -else且这些分支依赖该对象的状态

    实战

    用户登录系统

    取在普通的应用中,一个转发按钮,判断用户登录状态,如果未登录会先让用户登录,然后在执行转发操作

    如果是已登录,可以直接执行转发操作。可见,对于一个按钮的操作对于不同状态处理完全不同,

    MainActivity代码

     

    [java] view plain copy
     
    1. public class MainActivity extends Activity {  
    2.     @Override  
    3.     public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {  
    4.         super.onCreate(savedInstanceState, persistentState);  
    5.         //转发按钮  
    6.         findViewById(R.id.activity_main).setOnClickListener(new View.OnClickListener() {  
    7.             @Override  
    8.             public void onClick(View view) {  
    9.                 LoginContext.getLoginContext().forward(MainActivity.this);  
    10.             }  
    11.         });  
    12.         //注销按钮  
    13.         findViewById(R.id.activity_main).setOnClickListener(new View.OnClickListener() {  
    14.             @Override  
    15.             public void onClick(View view) {  
    16.                 LoginContext.getLoginContext().setState(new LogoutState());  
    17.             }  
    18.         });  
    19.     }  
    20. }  


    LoginActivity

     

     

    [java] view plain copy
     
    1. public class LoginActivity extends Activity {  
    2.     EditText user;  
    3.     EditText pwd;  
    4.   
    5.     @Override  
    6.     public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {  
    7.         super.onCreate(savedInstanceState, persistentState);  
    8.         findViewById(R.id.activity_main).setOnClickListener(new View.OnClickListener() {  
    9.             @Override  
    10.             public void onClick(View view) {  
    11.                 login();  
    12.                 finish();  
    13.             }  
    14.         });  
    15.     }  
    16.   
    17.     private void login() {  
    18.         String name = user.getText().toString();  
    19.         String pwd1 = pwd.getText().toString();  
    20.         //执行网络请求  
    21.         //登录成功后修改为已登录状态  
    22.         LoginContext.getLoginContext().setState(new LoginedState());  
    23.     }  
    24. }  

    LoginContext

     

     

    [java] view plain copy
     
    1. /****************************************** 
    2.  * 类名称:LoginContext 
    3.  * 类描述:用户接口和状态管理类 
    4.  * 
    5.  * @version: 2.3.1 
    6.  * @author:  
    7.  * @time: 2016/11/16 14:12 
    8.  ******************************************/  
    9. public class LoginContext {  
    10.     UserState mState = new LogoutState();  
    11.     static LoginContext sLoginContext = new LoginContext();  
    12.   
    13.     private LoginContext() {  
    14.   
    15.     }  
    16.   
    17.     public static LoginContext getLoginContext() {  
    18.         return sLoginContext;  
    19.     }  
    20.   
    21.     public void setState(UserState aState) {  
    22.         this.mState = aState;  
    23.     }  
    24.   
    25.     public void forward(Context context) {  
    26.         mState.forward(context);  
    27.     }  
    28.   
    29.     public void comment(Context context) {  
    30.         mState.comment(context);  
    31.     }  
    32. }  


    用户状态类 UserState

     

     

    [java] view plain copy
     
    1. public interface UserState {  
    2.     public void forward(Context context);  
    3.   
    4.     public void comment(Context context);  
    5. }  

     


    已登录状态LoginedState

     

    [java] view plain copy
     
    1. /****************************************** 
    2.  * 类名称:LoginedState 
    3.  * 类描述:已登录状态 
    4.  * @time: 2016/11/16 14:13 
    5.  ******************************************/  
    6. public class LoginedState implements UserState {  
    7.     @Override  
    8.     public void forward(Context context) {  
    9.         Log.i("TAG""转发");  
    10.     }  
    11.   
    12.     @Override  
    13.     public void comment(Context context) {  
    14.         Log.i("TAG""评论");  
    15.     }  
    16. }  


    注销状态未登录状态LogoutState

     

     

    [java] view plain copy
     
    1. public class LogoutState implements UserState {  
    2.     @Override  
    3.     public void forward(Context context) {  
    4.         goToLogin(context);  
    5.     }  
    6.   
    7.     @Override  
    8.     public void comment(Context context) {  
    9.         goToLogin(context);  
    10.     }  
    11.   
    12.     private void goToLogin(Context context) {  
    13.         Intent intent = new Intent(context, LoginActivity.class);  
    14.         context.startActivity(intent);  
    15.     }  
    16. }  


    如果不使用状态模式,在任何调用这些功能时都要进行是否登录的判断,代码逻辑就变成If-else,如果再增加用户一个状态,还需要再支持对这个状态的判断,使得模块很脆弱,一单忘记某个用户状态进行判断,很容易引发用户权限问题,

     


    总结:

    状态模式的关键在于不同状态下对同一行为有不同的响应,其实就是一个将if -else用多态来实现的一个例子。

    优点:

    State模式将所有与一个特定的状态相关的行为都放入一个状态对象中,它提供了一个更好的方法来组织与特定状态相关的代码,将繁琐的状态判断转换成结构清晰的状态类族,在避免代码膨胀的同事也保证了可扩展性与可维护性

    缺点:

    增加系统类和对象的个数


  • 相关阅读:
    ECNU 3288 成绩计算
    ECNU 3241 字母替换
    ECNU 3243 搜索联系人
    ECNU 2977 成绩排序
    ECNU 2974 统计单词个数
    ECNU 3092 GDP
    【Codeforces Round #693 (Div. 3) D】Even-Odd Game
    【Codeforces Round #693 (Div. 3) C】Long Jumps
    【Codeforces Round #693 (Div. 3) B】Fair Division
    【Codeforces Round #693 (Div. 3) A】Cards for Friends
  • 原文地址:https://www.cnblogs.com/vegetate/p/9997193.html
Copyright © 2011-2022 走看看