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

    缺点:

    增加系统类和对象的个数


  • 相关阅读:
    121. Best Time to Buy and Sell Stock
    70. Climbing Stairs
    647. Palindromic Substrings
    609. Find Duplicate File in System
    583. Delete Operation for Two Strings
    556 Next Greater Element III
    553. Optimal Division
    539. Minimum Time Difference
    537. Complex Number Multiplication
    227. Basic Calculator II
  • 原文地址:https://www.cnblogs.com/vegetate/p/9997193.html
Copyright © 2011-2022 走看看