代理设计模式

举报
孙中明 发表于 2022/01/23 00:47:21 2022/01/23
【摘要】 静态代理 抽象角色 : 一般使用接口或者抽象类来实现真实角色 : 被代理的角色,继承与抽象类代理角色 : 代理真实角色 一般会做一些附属的操作 .类似于角色增强客户 : 主函数,使用代理角色来进行一些操...

静态代理

  • 抽象角色 : 一般使用接口或者抽象类来实现
  • 真实角色 : 被代理的角色,继承与抽象类
  • 代理角色 : 代理真实角色 一般会做一些附属的操作 .类似于角色增强
  • 客户 : 主函数,使用代理角色来进行一些操作

抽象角色

public interface Singer {
/**
* 歌星都能唱歌
*/
void sing();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

真实角色

public class MaleSinger implements Singer{
	private String name;
	
	public MaleSinger(String name) {
		this.name = name;
	}

	@Override
	public void sing() {
		System.out.println(this.name + "开始唱歌了!");
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

代理角色

public class Agent implements Singer {
	private Singer singer;
	public Agent(Singer singer) {
		this.singer = singer;
	}
@Override
public void sing() {
	System.out.println("节目组找过来!需要演出,谈好演出费用。。。。。");
	singer.sing();
	System.out.println("结算费用,下一次合作预约。。。。。。");
   }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

客户


public class Client {
	public static void main(String[] args) {
		Singer singer = new MaleSinger("鹿晗");
		Singer agent = new Agent(singer);
		agent.sing();
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

鹿晗还是鹿晗,没有必要为了一下前置后置工作改变鹿晗这个类
公共的统一问题交给代理处理
公共业务进行扩展或变更时,可以更加方便
这不就是更加符合开闭原则,单一原则吗?

每个类都写个代理,麻烦死了。

动态代理

  • 动态代理的代理类是动态生成的 . 静态代理的代理类是我们提前写好的
  • 动态代理分为两类 : 一类是基于接口动态代理 , 一类是基于类的动态代理
    • 基于接口的动态代理----JDK动态代理
    • 基于类的动态代理–cglib(有兴趣自己研究)

jdk动态代理

【InvocationHandler:调用处理程序】

Object invoke(Object proxy, 方法 method, Object[] args)//参数
//proxy - 调用该方法的代理实例
//method -所述方法对应于调用代理实例上的接口方法的实例。方法对象的声明类将是该方法声明的接口,它可以是
代理类继承该方法的代理接口的超级接口。
//args -包含的方法调用传递代理实例的参数值的对象的阵列,或null如果接口方法没有参数。原始类型的参数包含
在适当的原始包装器类的实例中,例如java.lang.Integer或java.lang.Boolean 。

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

【Proxy : 代理】


//生成代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
rent.getClass().getInterfaces(),this);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

代码实现


package prox.Dprox;

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

public class Agent implements InvocationHandler {
    private Singer singer;

    public Agent(Singer singer) {
        this.singer=singer;
    }

    /**
     * 设置代理的经济人
     * @param singer
     */
    public void Agent(Singer singer) {
        this.singer = singer;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("---------------经纪人把把关--------------");
        Object returnObj = method.invoke(singer, args);
        System.out.println("---------------唱完了收收钱------------------------");
        return returnObj;
    }
    /**
     * 获取一个代理对象
     * @return
     */


    public static Object getProxy(Singer singer){
        Agent agent = new Agent(singer);
        return Proxy.newProxyInstance(Agent.class.getClassLoader(),singer.getClass().getInterfaces(),agent );
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

package prox.Dprox;

public class Client {
    public static void main(String[] args) {
        Singer singer= new MaleSinger("刘德华");
        Singer agent= (Singer)Agent.getProxy(singer);
        agent.sing();

        Singer singer1= new MaleSinger("张学友");
        Singer agent1= (Singer)Agent.getProxy(singer1);
        agent1.sing();
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述

文章来源: hiszm.blog.csdn.net,作者:孙中明,版权归原作者所有,如需转载,请联系作者。

原文链接:hiszm.blog.csdn.net/article/details/111150961

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。