概念
代理模式是一种结构型设计模式,它允许通过代理对象来控制对另一个对象(即目标对象)的访问。
代码案例
java
public interface FactoryUser {
User creatUser(String name, String ID);
}
java
public class AdminFactory implements FactoryUser {
@Override
public User creatUser(String name, String ID) {
return new AdminUser(name,ID);
}
}
java
public class NormalFactory implements FactoryUser {
@Override
public User creatUser(String name, String ID) {
return new NormalUser(name, ID);
}
}
java
public abstract class User {
String name;
String ID;
public User(String name, String ID) {
this.name = name;
this.ID = ID;
}
public abstract void menu();
}
java
public class AdminUser extends User{
public AdminUser(String name, String ID) {
super(name, ID);
}
@Override
public void menu() {
System.out.println("打开管理员菜单");
}
public void addBook(String bookname) {
System.out.println(this.name+",您添加成功"+bookname);
}
}
java
public class NormalUser extends User{
public NormalUser(String name, String ID) {
super(name, ID);
}
@Override
public void menu() {
System.out.println("打开普通用户菜单");
}
public void borrowBook() {
System.out.println(this.name+"借阅图书");
}
}
java
public class ProxyUser {
private User proxyuser;
public ProxyUser(User proxyuser) {
this.proxyuser = proxyuser;
}
public void proxymenu() {
this.proxyuser.menu();
}
public void addBook(String bookname) {
System.out.println(this.proxyuser.name+"开始检查权限:");
if(proxyuser instanceof AdminUser) {
((AdminUser) proxyuser).addBook(bookname);
}else System.out.println(this.proxyuser.name+",您没有权限上架书籍");
}
}
java
public class Test {
public static void main(String[] args) {
AdminFactory adminFactory = new AdminFactory();
User zhangsan = adminFactory.creatUser("zhangsan", "223");
NormalFactory normalFactory = new NormalFactory();
User lisi = normalFactory.creatUser("lisi", "221");
User wangwu = normalFactory.creatUser("wangwu", "222");
zhangsan.menu();
ProxyUser proxyAdminUser = new ProxyUser(zhangsan);
proxyAdminUser.addBook("水浒传");
wangwu.menu();
ProxyUser proxyNormalUser = new ProxyUser(lisi);
proxyNormalUser.addBook("西游记");
}
}
输出:
打开管理员菜单
zhangsan开始检查权限:
zhangsan,您添加成功水浒传
打开普通用户菜单
lisi开始检查权限:
lisi,您没有权限上架书籍
代码解释:
1、上述代码也用到了工厂模式。定义了一个抽象工厂接口Factory
,AdminFactory
和NormalFactory
实现了这接口,可以创建多个对象。
2、定义了一个用户类(父类),里面有抽象方法menu()
和构造方法。
3、AdminUser
和NormalUser
都继承了抽象类User
,重写了menu()
方法,并且实现了属于自己的方法。
4、定义了一个代理类,里面定义成员属性private User proxyuser;
(用User做类型是为了可以发生向下转型)。定义一个构造方法,传入需要代理的对象。此时,代理类的成员属性指向这个对象。
5、调用proxymenu()
方法,来调用对象自己的menu()
方法。
6、在addBook()
方法中,检查类型是否匹配,只有AdminUser
才能调用此方法,使用instanceof
关键字进行判断。
7、代理类作用:一是作为被代理 User
对象方法调用的中转站,如 proxymenu
方法;二是在特定方法(如 addBook
方法)调用前进行权限检查,实现对被代理对象功能的控制和扩展,增强了系统的安全性和访问控制能力 。