研磨设计模式day11代理模式

这篇具有很好参考价值的文章主要介绍了研磨设计模式day11代理模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

场景

代码实现

​编辑

解析

定义

代理模式调用示意图

代理模式的特点 

本质 

​编辑何时选用 


场景

我有一个订单类,包含订单数、用户名和商品名,有一个订单接口包含了对订单类的getter和setter

现在有一个需求,a创建的订单只能a修改,其他人无权修改

代码实现

定义OrderApi接口

package day10代理模式;

public interface OrderApi {

    public String getProductName();

    void setProductName(String productName,String user);

    public String getOrderUser();

    public void setOrderUser(String orderUser,String user);

    public int getOrderNum();

    void setOrderNum(int orderNum,String user);
}

Order类,实现订单接口

package day10代理模式;

public class Order implements OrderApi{
    
    private String productName;

    private int orderNum;

    private String orderUser;
    
    
    public Order(String productName, int orderNum, String orderUser) {
        this.productName = productName;
        this.orderNum = orderNum;
        this.orderUser = orderUser;
    }

    @Override
    public String toString() {
        return "Order{" +
                "productName='" + productName + '\'' +
                ", orderNum=" + orderNum +
                ", orderUser='" + orderUser + '\'' +
                '}';
    }

   


    public void setOrderUser(String orderUser) {
        this.orderUser = orderUser;
    }


    public void setProductName(String productName) {
        this.productName = productName;
    }

    @Override
    public int getOrderNum() {
        return orderNum;
    }

    @Override
    public void setOrderNum(int orderNum,String user) {
        this.orderNum = orderNum;
    }

    @Override
    public String getProductName() {
        return productName;
    }

    @Override
    public void setProductName(String productName, String user) {
        this.productName = productName;
    }

    @Override
    public String getOrderUser() {
        return this.orderUser;
    }

    @Override
    public void setOrderUser(String orderUser, String user) {
        this.orderUser = orderUser;
    }
}

现在创建一个代理类

package day10代理模式.java中的代理类;

import day10代理模式.Order;
import day10代理模式.OrderApi;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * 使用java中的动态代理
 */
public class DynamicProxy implements InvocationHandler {
    /**
     * 被代理的对象
     */
    private OrderApi order = null;


    /**
     * 获取 绑定好代理和具体对象后的目标对象的 接口
     *
     * @param order 具体的订单对象,相当于具体目标对象
     * @return 绑定好代理和具体对象后的目标对象的接口
     */
    public OrderApi getProxyInterface(Order order) {
        // 设置被代理的对象,好方便invoke里面的操作
        this.order = order;
        // 把真正的订单对象和动态代理关联起来
        OrderApi orderApi = (OrderApi) Proxy.newProxyInstance(order.getClass().getClassLoader(), order.getClass().getInterfaces(), this);
        return orderApi;
    }

    /**
     * 实现invoke,在这个方法里面,具体判断当前是在调用什么方法,需要如何处理
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

//        System.out.println("用到的方法有什么"+method.getName());
        System.out.println("args有什么"+ Arrays.toString(args));
        if (method.getName().startsWith("set")) {
            System.out.println("进入setter方法了哟");
            // 如果不是创建人,那就不能修改
            if (order.getOrderUser() != null && order.getOrderUser().equals(args[1])) {
                // 可以操作
                return method.invoke(order,args);
            }else {
//                args[1] 表示第二个才是用户
                System.out.println("对不起, " + args[1] + ",您无权修改本订单中的数据");
            }
        }else if(method.getName().startsWith("to")){
            System.out.println("现在调用toString方法了哟");
            return method.invoke(order,args);
        }else {
            // 不是调用setter方法就继续执行
            return method.invoke(order,args);
        }
        return null;
    }


}

Client

package day10代理模式;

import day10代理模式.java中的代理类.DynamicProxy;

public class Client {
    public static void main(String[] args) {
        // 1.张三先创建了一个订单
        Order order = new Order("设计模式", 100, "张三");

        // 2.创建一个动态代理
        DynamicProxy dynamicProxy = new DynamicProxy();

        // 3.将订单与动态代理关联起来
        OrderApi orderApi = dynamicProxy.getProxyInterface(order);

        //4.以下就需要使用被代理过的接口来操作了

            //4.1 李四想要来修改,那就会报错
            orderApi.setOrderNum(123,"李四");
            System.out.println("李四修改后的记录==>  "+orderApi);

            //4.2 张三修改
            orderApi.setOrderNum(123,"张三");
            System.out.println("张三修改后的记录==>  "+orderApi);
    }
}

研磨设计模式day11代理模式,设计模式,代理模式

解析

代理类首先是实现一个名为InvocationHandler的接口。需要持有被代理对象也就是OrderApi,然后通过一个对外提供的方法将代理与被代理绑定起来。实现invoke方法,这个方法就是为了判断订单接口中当前在使用的方法,对正在使用的方法做什么处理

一行一行解析就是首先判断方法名字是不是set开头的,如果是就看一下订单对象是否为空和这个方法传过来的值中的第1个下标对象是不是等于持有的对象,如果是就可以操作,如果不是就提示。

定义

研磨设计模式day11代理模式,设计模式,代理模式

 文章来源地址https://www.toymoban.com/news/detail-685811.html

代理模式调用示意图

研磨设计模式day11代理模式,设计模式,代理模式

代理模式的特点 

研磨设计模式day11代理模式,设计模式,代理模式

本质 

控制对象访问

何时选用 

研磨设计模式day11代理模式,设计模式,代理模式研磨设计模式day11代理模式,设计模式,代理模式

 

 

到了这里,关于研磨设计模式day11代理模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 研磨设计模式day14模板方法模式

    目录 场景 原有逻辑 有何问题 解决方案 解决思路  代码实现  重写示例 模板方法的优缺点 模板方法的本质  何时选用 场景 现在模拟一个场景,两个人要登录一个系统,一个是管理员一个是用户,这两个不同身份的登录是由后端对应的两个接口实现的,用户登录只需验证库

    2024年02月10日
    浏览(34)
  • 设计模式之代理模式(静态代理&动态代理)

    目录 1、什么是代理模式 2、代理模式的结构 3、代理模式的实现 3.1 静态代理和动态代理概念 3.2 静态代理 3.3 动态搭理 3.3.1 代码实现 3.3.2 Proxy类讲解 4、动态代理VS静态代理 5、代理模式优缺点 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象

    2024年02月03日
    浏览(33)
  • 设计模式8:代理模式-静态代理

    我尝试在JDK、Android SDK和一些出名的库中,寻找静态代理的源码,没能找到。如果有读者发现,欢迎评论或者私信我。 1. 售票代理 售票服务 站点售票 代理网点售票 2. 明星代理

    2024年02月11日
    浏览(36)
  • 设计模式8:代理模式-动态代理

    上一篇:设计模式8:代理模式-静态代理 “动态”的含义是 代码生成代理类,一个代理类可以代理多个接口 。 动态区别于 死板 ,静态代理中一个代理类只能代理一个接口,其他不同的接口,就需要再手写不同的代理类,这就很 死板 。 动态代理类似于在安卓里面,我们常

    2024年02月09日
    浏览(31)
  • Java设计模式 (三) 代理设计模式

    什么是代理设计模式? 代理设计模式是一种结构型设计模式,它允许创建一个代理对象,用于控制对其他对象的访问。代理模式通常用于在访问对象时添加一些附加操作,而不是直接访问真实对象。代理模式可以在不改变原始类代码的情况下,通过引入代理类来增强功能。 代

    2024年02月12日
    浏览(41)
  • 设计模式详解-代理模式

    类型:结构型模式 实现原理:创建具有现有对象的对象 作用:为其他对象提供一种代理以控制对这个对象的访问。 解决的问题:由于对象的访问条件不一,直接访问对象会造成麻烦问题 解决问题的方法:增加中间层。 何时使用:想在访问一个类时做一些控制。 实现核心:

    2024年02月12日
    浏览(36)
  • 设计模式——代理模式

    代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一个代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介作用,可以添加额外的功能或限制对目标对象的直接访问。 抽象主题(Subject Interface): 定义了目标对象和代理对象共有的接口。

    2024年01月17日
    浏览(48)
  • 【设计模式】代理模式

    5.1.1 概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。 Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理类在编译期就生成

    2024年02月15日
    浏览(48)
  • 设计模式-代理模式

    ● 为对象提供一个代理类,增强该对象的方法,控制对这个对象的访问 ● 静态代理和动态代理:静态代理就是编译的时候就已经确定,而动态代理就是运行时才会生成 缓存代理 ● 提供数据的缓存功能,避免数据库重复查询 实践 定义数据查询的接口 接口实现类实现接口

    2024年02月11日
    浏览(34)
  • 设计模式 -- 代理模式

    月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸-吸收各种知识-不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同样希望大家

    2023年04月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包