当前位置: 首页 > news >正文

JAVA学习*简单的代理模式

概念

代理模式是一种结构型设计模式,它允许通过代理对象来控制对另一个对象(即目标对象)的访问。

代码案例

public interface FactoryUser {
    User creatUser(String name, String ID);
}
public class AdminFactory implements FactoryUser {
    @Override
    public User creatUser(String name, String ID) {
        return new AdminUser(name,ID);
    }
}
public class NormalFactory implements FactoryUser {
    @Override
    public User creatUser(String name, String ID) {
        return new NormalUser(name, ID);
    }
}
public abstract class User {
    String name;
    String ID;

    public User(String name, String ID) {
        this.name = name;
        this.ID = ID;
    }

    public abstract void menu();
}
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);
    }
}
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+"借阅图书");
    }
}

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+",您没有权限上架书籍");
    }
}
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、上述代码也用到了工厂模式。定义了一个抽象工厂接口FactoryAdminFactoryNormalFactory实现了这接口,可以创建多个对象。
2、定义了一个用户类(父类),里面有抽象方法menu()和构造方法。
3、AdminUserNormalUser都继承了抽象类User,重写了menu()方法,并且实现了属于自己的方法。
4、定义了一个代理类,里面定义成员属性private User proxyuser;(用User做类型是为了可以发生向下转型)。定义一个构造方法,传入需要代理的对象。此时,代理类的成员属性指向这个对象。
5、调用proxymenu()方法,来调用对象自己的menu()方法。
6、在addBook()方法中,检查类型是否匹配,只有AdminUser才能调用此方法,使用instanceof关键字进行判断。
7、代理类作用:一是作为被代理 User 对象方法调用的中转站,如 proxymenu 方法;二是在特定方法(如 addBook 方法)调用前进行权限检查,实现对被代理对象功能的控制和扩展,增强了系统的安全性和访问控制能力 。

相关文章:

  • 机器学习的一百个概念(4)下采样
  • Ground Truth(真实标注数据):机器学习中的“真相”基准
  • UE5学习笔记 FPS游戏制作32 主菜单,暂停游戏,显示鼠标指针
  • 【STL】stack
  • Java数据结构-栈和队列
  • Open GL ES ->GLSurfaceView+离屏渲染滤镜作用的Bitmap+动态顺序叠加滤镜作用链的RecyclerView
  • 前端Three.js入门(五)
  • 智慧养老线上线下联动:重构多样化养老服务的创新实践
  • 嵌入式软件安全设计指南(V2.0)
  • 前沿科技:从Gen2到Gen3—Kinova轻型机械臂的技术升级路径
  • Transformer预训练模型(如BERT、GPT)的特殊标记
  • 在 UniApp 编译小程序时出现 `:class` 不支持 `getStatusClass(device.deviceStatus)` 语法的报错
  • idea解决properties中文乱码
  • 横扫SQL面试——连续性登录问题
  • Vue2和Vue3响应式的基本实现
  • vue:突然发现onok无法使用
  • 庙算兵棋推演AI开发初探(空想篇-RLHF尝试)
  • leetcode148.排序链表
  • NestJS——创建项目、编写User模块
  • 谷歌浏览器安装Vue开发者工具指南
  • 百度seo招聘/seo技巧
  • 您的网站审核未通过_原因是"网站建设不完善/百度账号管理
  • centos7做网站/百度移动权重
  • wordpress与dede哪个好用/好口碑关键词优化地址
  • 西樵网站设计制作/沈阳网站制作优化推广
  • 电子商务网站建设与管理/营销策划方案怎么写?