状态模式

最近看了一本关于设计模式的书,看到这个状态模式,正好相对应我做项目的模块登录与分享的模块,用起来真的也是方便了不少。也有了一种恍然大悟的感觉,就象以前不经意看到的一篇博客,然后过了很长时间再回头去看,哦,原来是这样。没有使用状态模式之前就是每次去点击功能按钮都要经过if else 去判断,麻烦了不少,今天你你肯定会有收获。

这里写图片描述

这个图可能画的比较潦草,但是你仔细看的话,肯定就很容易就明白。下面我就跟大家一起分析一下这个迷一样的图。

一.大体的流程

  1. 实现用户状态的接口
  2. 两个类,一个未登录的类与一个登录的类都去实现这种接口,不同的类实现方法不相同
  3. 定义一个控制登录状态的类,去控制用户的登录的状态从而不同的操作
  4. 我们定义了两个功能,被是分享功能还有个就是注销的功能,大家肯定都能想到分享功能肯定是登录后才能做操作的,注销就是注销哦。

二.下边开始对应流程贴代码

做一个强大CV战士,^_^。

1.实现用户状态的接口

 public interface UserState<T> {
    /**
     * 转发的函数
     */
    void forworl(T t);

}

2. 两个类,一个未登录的类与一个登录的类都去实现这种接口,不同的类实现方法不相同

未登录的类

public class LogOutState implements UserState<Context> {

    @Override
    public void forworl(Context context) {
        //未登录他就跳转页面跳转到登录的页面吗,符合正常的逻辑
        gotoActivity(context);
    }

    /**
     * 登录的activity的跳转的方法
     *
     */
    private void gotoActivity(Context con) {
        Intent intent = new Intent(con, LoginActivity.class);
        con.startActivity(intent);
    }
}

登录的类

public class LoginState implements UserState {

    @Override
    public void forworl(Object o) {
        Context con = (Context) o;
        Toast.makeText(con, "转发成功", Toast.LENGTH_SHORT).show();
    }
}

3. 定义一个控制登录状态的类,去控制用户的登录的状态从而不同的操作

public class LoginContext {
    /**
     * 默认的登录状态为未登录的状态
     */
    private UserState mState = new LogOutState();

    static LoginContext mLoginContext = new LoginContext();

    public LoginContext() {
    }

    public static LoginContext getmLoginContext() {
        return mLoginContext;
    }

    public void setmState(UserState mState) {
        this.mState = mState;
    }

    /**
     * 分享的方法
     */
    public void forward(Context context) {
        mState.forworl(context);
    }

}

4. 我们定义了两个功能,被是分享功能还有个就是注销的功能,大家肯定都能想到分享功能肯定是登录后才能做操作的,注销就是注销哦。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.forworl_btn)
                .setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        LoginContext.getmLoginContext().forward(MainActivity.this);
                        LoginContext.getmLoginContext().setmState(new LoginState());
                    }
                });
        findViewById(R.id.logout_btn)
                .setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        LoginContext.getmLoginContext().setmState(new LogOutState());
                    }
                });

    }
}

MainActivity的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="zl.com.statedemo.MainActivity">

    <Button
        android:id="@+id/forworl_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="转发"/>

    <Button
        android:id="@+id/logout_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="注销"/>


</LinearLayout>

登录的LoginActivity

public class LoginActivity extends AppCompatActivity {

    private EditText id_editText;
    private EditText pwd_editText;
    private Button login_btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        id_editText = (EditText) findViewById(R.id.login_id);
        pwd_editText = (EditText) findViewById(R.id.login_pwd);
        login_btn = (Button) findViewById(R.id.login_btn);

        login_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String userId = id_editText.getText().toString().trim();
                String userPwd = pwd_editText.getText().toString().trim();
                if (!userId.equals("") && !userPwd.equals("")) {
                    finish();
                    Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

LoginActivity的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="zl.com.statedemo.LoginActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="用户名:"
            android:textSize="20sp"/>

        <EditText
            android:id="@+id/login_id"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="密码:"
            android:textSize="20sp"
            />

        <EditText
            android:id="@+id/login_pwd"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:password="true"/>
    </LinearLayout>

    <Button
        android:id="@+id/login_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="登录"/>

</LinearLayout>

好了就是这样的,懂了的朋友给个star吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值