java-day25
接口的意义
例如我们可以在完成功能之前,在接口中可以提前先定义出完成功能要使用到的相关方法,这里的方法都是抽象方法,也就是只有方法的声明, 没有方法的实现。同时接口也可以帮我们在一定程度上解决,类和类之间单继承的束缚,因为接口可以被多现实。在学习编程的过程中,我们会遇到很多规范、标准,在java中大多的规范、标准都是以接口的方式进行体现,因为类实现接口后,类中一定是有接口里面所声明的方法的实现,只有我们实现规范、标准中所提供的接口,那么我们的类中也一定会要这些方法,这时候我们的类其实也就是在按照这些规范、标准要的方式进行编写。
接口案例
实现用户登录以及用户权限操作的简单接口案例
SecuritySystem接口
public interface SecuritySystem{
//验证通过后,返回当前登录的这个用户
public User verifyLogin(String name,String password);
//验证指定用户是否有权限完成指定操作
public boolean verifyPemission(User user,String op);
//完成用户执行的操作
public void operation(String op);
}
User类
class User{
private String name; //用户名
private String password; //密码
private String[] allowOps; //操作
public User(String name,String password,String... op){
this.name = name;
this.password = password;
this.allowOps = op;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public String getPassword(){
return this.password;
}
public void setPassword(String password){
this.password = password;
}
public String[] getAllowOps(){
return this.allowOps;
}
public void setAllowOps(String[] allowOps){
this.allowOps = allowOps;
}
}
ZZbSecuritySystem implements SecuritySystem
class ZZbSecuritySystem implements SecuritySystem {
//系统中的用户数组,代替将来的数据库db
private User[] db;
public ZZbSecuritySystem(User... user){ //构造方法,给属性赋值
this.db = user;
}
//验证通过后,返回当前登录的这个用户,验证失败返回null
public User verifyLogin(String username,String password){
//查看数据库中的每一个user
//对比user用户名和密码,是否和输入的相等
for(int i=0;i<db.length;i++){
User u = db[i];
if(u.getName().equals(username)
&& u.getPassword().equals(password)){
return u;
}
}
return null;
}
//验证指定用户是否有权限完成指定操作
public boolean verifyPemission(User user,String op){
String[] allow = user.getAllowOps();
for(int i=0;i<allow.length;i++){
String str = allow[i];
if(str.equals(op)){
return true;
}
}
return false;
}
//完成用户执行的操作
public void operation(String op){
System.out.println("\t已完成指定操作:"+op);
}
}
DefaultSecuritySystem implements SecuritySystem
class DefaultSecuritySystem implements SecuritySystem{
//验证通过后,返回当前登录的这个用户
public User verifyLogin(String name,String password){
return new User(name,password);
}
//验证指定用户是否有权限完成指定操作
public boolean verifyPemission(User user,String op){
return true;
}
//完成用户执行的操作
public void operation(String op){
System.out.println("\t已完成指定操作:"+op);
}
}
测试类
class Test{
public static void main(String[] args){
SecuritySystem sys = null;
//系统中的内置用户
User u1 = new User("tom","123","q","w");
User u2 = new User("jerry","456","e","r");
User u3 = new User("zzb","zzb","q");
sys = new ZZbSecuritySystem(u1,u2,u3);
//默认操作
//sys = new DefaultSecuritySystem();
//当前登录系统的用户
User user = null;
//用来接受用户输入的用户和密码
String username = null;
String password = null;
String op = null;//用户登录成功后执行的操作名称
//读取键盘中的输入
Scanner sc = new Scanner(System.in);
//用户登录的交互逻辑
while(true){
System.out.print("请输入用户名:\t");
//hasNext():代码在此阻塞等待用户输入
if(sc.hasNext()){
username = sc.nextLine();
}
System.out.print("请输入密码:\t");
if(sc.hasNext()){
password = sc.nextLine();
}
//验证用户输入用户名和密码
user = sys.verifyLogin(username,password);
if(user!=null){
System.out.println("登陆成功!\t");
break;
}
//退出
else if("bye".equals(op)){
System.out.println(user.getName()+"退出,欢迎再次使用!");
break;
}else{
System.out.println("登陆失败!请检查用户名或密码");
}
}
//用户执行的操作逻辑
while(true){
System.out.print("请输入要执行的操作(bye退出): \t");
//退出
if("bye".equals(op)){
System.out.println(user.getName()+"退出,欢迎再次使用!");
break;
}
else if(sc.hasNext()){
op = sc.nextLine();
}
else if(sys.verifyPemission(user,op)){
sys.operation(op);
}else{
System.out.println("权限不够,请重新输入!");
}
}
}
}