权限管理(工厂模式)

在某OA系统中,系统根据对比用户在登录时输入的账号和密码以及在数据库中存储的账号和密码是否一致来进行身份验证,如果验证通过,则取出存储在数据库中的用户权限等级(以整数形式存储),根据不同的权限等级创建不同等级的用户对象,不同等级的用户对象拥有不同的操作权限。
在这里插入图片描述
效果演示:
在这里插入图片描述
需要导入的包:
在这里插入图片描述

数据表:
在这里插入图片描述
sql语句:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `password` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `permission` int(255) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('100', '123456', 1);
INSERT INTO `user` VALUES ('102', '123456', 2);
INSERT INTO `user` VALUES ('103', '123456', 3);

SET FOREIGN_KEY_CHECKS = 1;

代码结构:
在这里插入图片描述
代码:
连接数据库:
mysql.properties文件:(以我自己的数据库user为例,用户名,密码都为root)

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/user?useSSL=true&characterEncoding=utf-8
username=root
password=root
maxActive=50
maxIdle=20
maxWait=60000

GetDBConnection类(用于连接数据库):

package com.song.Util;

import org.apache.commons.dbcp.BasicDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

public class GetDBConnection {
    private static Connection conn;
    private static DataSource ds;

    static{
        try {
            //创建数据源的实例
            InputStream inStream = GetDBConnection.class.getResourceAsStream("mysql.properties");
            Properties properties = new Properties();
            properties.load(inStream);
            ds = BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 获得数据库连接的方法
     * @return 数据库连接对象
     * @throws SQLException
     */
    public static synchronized Connection getConn() throws SQLException {
        if (conn == null || conn.isClosed()) {
            conn = ds.getConnection();
        }
        return conn;
    }
//    获得数据库操作语句
    public static PreparedStatement getPreparedStatement(Connection con, String sql, Object[] obj){
        PreparedStatement pre=null;
        if(con!=null){
            try {
                pre=con.prepareStatement(sql);
                for(int i=0;i<obj.length;i++){
                    pre.setObject(i+1,obj[i]);
//                    System.out.println(i+1);
//                    System.out.println(obj[i]);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
return pre;
    }
//    执行查询语句并获得结果
    public static ResultSet getResult(PreparedStatement pre){
        ResultSet rs=null;
        try {
            rs=pre.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }

//    执行非查询语句
    public static int execute(PreparedStatement pre){
        int rs=0;
        try {
            rs=pre.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }
    /**
     * 释放连接
     */
    public static void closeConn() {
        try {
            if (conn != null && !conn.isClosed()) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            conn = null;
        }
    }
}


USer类(抽象类)

package com.song.user;
public abstract class User {
public abstract void diff();
public void same()
    {
        System.out.println("共同操作权限");
    }
}

Administrator类(具体类):

package com.song.user;
public abstract class User {
public abstract void diff();
public void same()
    {
        System.out.println("共同操作权限");
    }
}

President类(具体类):

package com.song.user;
public class President extends User{
    @Override
    public void diff() {
        System.out.println("校长操作权限");
    }
}

Teacher类(具体类):

package com.song.user;
public class Teacher extends User{
    @Override
    public void diff() {
        System.out.println("老师操作权限");
    }
}

UserFactory类:

package com.song.factory;
import com.song.user.Administrator;
import com.song.user.President;
import com.song.user.Teacher;
import com.song.user.User;
//简单工厂
public class UserFactory {
    public User CreateUser(String premission) {
        User user = null;
        if (premission.equals("1")) {
            user = new Administrator();
        } else if (premission.equals("2")) {
            user = new President();
        } else if (premission.equals("3")) {
            user = new Teacher();
        }
        return user;

    }
}

Accredit类(给用户赋予权限):

package com.song.factory;
import com.song.user.User;
public class Accredit {
    UserFactory userFactory;
    //构造函数
    public Accredit(UserFactory userFactory) {
        setFactory(userFactory);
    }
    //给用户赋予权限
    public void setFactory(UserFactory userFactory) {
        User user= null;
        String premission;
        do {
            CheckUser cu=new CheckUser();
            //获得用户权限值
            premission =cu.getpremission();
            //调用用户工厂,根据用户权限值创建对应的用户
            user = userFactory.CreateUser(premission);
            if (user != null) {
                user.diff();
                user.same();
            }
        } while (true);
    }
}

CheckUse类(检查登录,获取权限值):

package com.song.factory;
import com.song.Util.GetDBConnection;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class CheckUser {
    //检查用户名密码是否正确,如果正确则返回该用户的权限值,否则返回null
    public String check(String id,String password) throws SQLException {
        Connection con=null;
        PreparedStatement pre=null;
        ResultSet rs=null;
        String permission=null;
        String sqlstr="select * \n" +
                "from user\n"+
                "where id=? and  password=?";
        Object[] obj=new Object[2];
        obj[0]=id;
        obj[1]=password;
        con= GetDBConnection.getConn();
        pre= GetDBConnection.getPreparedStatement(con,sqlstr,obj);
        rs= GetDBConnection.getResult(pre);
        try {
            while (rs.next()){
                permission=rs.getString("permission");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            GetDBConnection.closeConn();
        }
        return permission;
    }
//根据输入的用户名密码,获得用户的等级
    public String getpremission() {
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(
                    System.in));
            String permission=null;
            while (permission==null){
                    System.out.println("----------------------------------------------------");
                    System.out.println("请输入账号:");
                    String id = strin.readLine();
                    System.out.println("请输入密码:");
                    String password = strin.readLine();
                    permission = check(id, password);//获得权限值
                    if(permission==null){
                        System.out.println("用户或密码错误,请重新输入!");
                    }
            }
            return permission;
        } catch (IOException | SQLException e) {
            e.printStackTrace();
            return "";
        }
    }

}

Login类(登录):

package com.song.factory;
public class Login {
    public static void main(String[] args) {
        UserFactory userFactory=new UserFactory();
        Accredit accredit=new Accredit(userFactory);
    }
}

求关注,求关注,求关注!!!
可以直接问我要代码

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面我来详细介绍一下如何在Java实现医疗管理系统应用抽象工厂模式、单例模式、装饰模式、策略模式、观察者模式。 1. 抽象工厂模式 抽象工厂模式是一种创建型设计模式,用于提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在Java实现医疗管理系统,可以采用抽象工厂模式来创建患者信息、医生信息、病历信息等相关对象。具体实现步骤如下: - 定义一个抽象工厂接口,包含创建患者信息、医生信息、病历信息等抽象方法。 - 定义具体工厂类,实现抽象工厂接口,用于创建具体的患者信息、医生信息、病历信息等对象。 - 定义抽象产品类,包含患者信息、医生信息、病历信息等抽象方法。 - 定义具体产品类,实现抽象产品类,用于创建具体的患者信息、医生信息、病历信息等对象。 2. 单例模式 单例模式是一种创建型设计模式,用于确保一个类只有一个实例,并提供全局访问点。在Java实现医疗管理系统,可以采用单例模式来创建数据库连接池等全局唯一的对象。具体实现步骤如下: - 定义一个私有的静态成员变量,用于存储唯一实例。 - 定义一个私有的构造函数,用于防止外部类创建实例。 - 定义一个公共的静态方法,用于获取唯一实例。 3. 装饰模式 装饰模式是一种结构型设计模式,用于动态地给一个对象添加一些额外的职责,而不影响其原有的行为。在Java实现医疗管理系统,可以采用装饰模式来添加权限控制、日志记录等额外的职责。具体实现步骤如下: - 定义一个抽象组件类,包含患者信息、医生信息、病历信息等抽象方法。 - 定义具体组件类,实现抽象组件类,用于创建具体的患者信息、医生信息、病历信息等对象。 - 定义一个抽象装饰器类,继承抽象组件类,包含额外的职责。 - 定义具体装饰器类,实现抽象装饰器类,用于添加权限控制、日志记录等额外的职责。 4. 策略模式 策略模式是一种行为型设计模式,用于定义一系列算法,将每个算法封装起来,并且使它们可以相互替换。在Java实现医疗管理系统,可以采用策略模式来实现不同的数据库访问策略等。具体实现步骤如下: - 定义一个抽象策略接口,包含数据库访问等抽象方法。 - 定义具体策略类,实现抽象策略接口,用于实现不同的数据库访问策略。 - 定义一个上下文类,用于保存当前策略对象,并提供设置策略对象的方法。 5. 观察者模式 观察者模式是一种行为型设计模式,用于定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变,所有依赖它的对象都将得到通知并被自动更新。在Java实现医疗管理系统,可以采用观察者模式来实现患者信息、医生信息、病历信息等的实更新。具体实现步骤如下: - 定义一个抽象主题接口,包含添加观察者、删除观察者、通知观察者等抽象方法。 - 定义具体主题类,实现抽象主题接口,用于保存患者信息、医生信息、病历信息等,并提供添加观察者、删除观察者、通知观察者等方法。 - 定义一个抽象观察者接口,包含更新数据等抽象方法。 - 定义具体观察者类,实现抽象观察者接口,用于实现更新患者信息、医生信息、病历信息等的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值