java代理模式

 首先,代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。其组成包括三部分:

抽象角色:通过接口或抽象类声明真实角色实现的业务方法。

代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

三个角色的关系为:抽象类或接口提供抽象方法,具体类实现抽象方法,代理类通过代理具体类并实现相关方法使客户端在调用具体类方法时不用知道实现类的细节,即可以修改实现部分实现方法。以上关系可以通俗的通过明星的运作模式来举例:抽象角色(会演戏,唱歌的明星),真实角色(张学友),代理角色(张学友经纪人),当某个综艺节目需要张学友来唱歌时会通过联系经纪人来确定歌神本人有没有档期,而不是直接联系张学友。

举例:public interface Star {//接口
public void sing();
public void acting();
}

public class ZXY implements Star {//具体类
public void sing() {
System.out.println("歌神唱歌很贵");
}
public void acting() {
System.out.println("歌神拍电影很贵");
}
}

public class Agent implements Star {//代理类
private Star s;
public Agent(Star s ){
this.s=s;
}
public void sing() {
s.sing();
}
public void acting() {//经纪人拒绝歌神拍电影的通告
s.acting();
System.out.println("歌神不拍电影了");
}
}

public class TV {//客户端的调用
public static void main(String[] args) {
ZXY z=new ZXY();
Star s=new Agent(z); 
s.acting();
s.sing();
}
}

运行结果:

以上为静态代理内容。

上述过程中,当综艺电视台需要请多个明星时就需要寻找到每一个Star的Agent类,如果我们能有一个平台帮我们省略掉找每一个Star的Agent的过程会不会更好呢,所以动态代理出现了

动态代理它可以直接给某一个目标对象生成一个代理对象,而不需要代理类存在。动态代理与代理模式原理是一样的,只是它没有具体的代理类,直接通过反射生成了一个代理对象。其中Java.lang.reflect.Proxy类可以直接生成一个代理对象

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class TV {
public static void main(String[] args) {
/*ZXY z=new ZXY();
Star s=new Agent(z); 
s.acting();
s.sing();*/
//Proxy.newProxyInstance():产生代理类的实例。仅能代理实现至少一个接口的类
//ClassLoader:类加载器。固定写法,和被代理类使用相同的类加载器即可。
//Class[] interface:代理类要实现的接口。固定写法,和被代理类使用相同的接口即可。
//InvocationHandler:策略(方案)设计模式的应用。如何代理?
final Star s=new ZXY();
Star proxy=(Star) Proxy.newProxyInstance(s.getClass().getClassLoader(), s.getClass().getInterfaces(), new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object o=method.invoke(s, null);
return o;
}
});

proxy.sing();
proxy.acting();
System.out.println("歌神不拍电影了");
}
}

运行结果与上面一致,当需要寻找其他Star的时只需要将 final Star s=new ZXY();中的具体类名换掉就可以了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java代理模式是一种结构型设计模式,其目的是为其他对象提供一种代理以控制对这个对象的访问。代理对象可以在客户端和目标对象之间充当中介,以便于客户端访问目标对象时,可以在不改变目标对象的情况下添加一些额外的功能,比如安全性、远程访问、缓存等。 在Java中,代理模式可以通过两种方式实现:静态代理和动态代理。静态代理需要手动编写代理类,而动态代理可以在运行时通过反射机制动态生成代理类,更加灵活。 举个例子,假设我们有一个接口`Subject`,其中定义了一些方法。我们希望在调用这些方法时,增加一些额外的日志记录功能。我们可以编写一个代理类`SubjectProxy`,在代理类中实现接口方法并调用目标对象的方法,同时在方法前后添加日志记录的代码。客户端则通过代理类访问目标对象。 静态代理示例代码如下: ```java public interface Subject { void doSomething(); } public class RealSubject implements Subject { @Override public void doSomething() { System.out.println("RealSubject do something."); } } public class SubjectProxy implements Subject { private Subject realSubject; public SubjectProxy(Subject realSubject) { this.realSubject = realSubject; } @Override public void doSomething() { System.out.println("Before do something."); realSubject.doSomething(); System.out.println("After do something."); } } public class Client { public static void main(String[] args) { Subject realSubject = new RealSubject(); Subject subjectProxy = new SubjectProxy(realSubject); subjectProxy.doSomething(); } } ``` 动态代理示例代码如下: ```java public class SubjectHandler implements InvocationHandler { private Object target; public SubjectHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before " + method.getName()); Object result = method.invoke(target, args); System.out.println("After " + method.getName()); return result; } } public class Client { public static void main(String[] args) { Subject realSubject = new RealSubject(); InvocationHandler handler = new SubjectHandler(realSubject); Subject subjectProxy = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler); subjectProxy.doSomething(); } } ``` 无论是静态代理还是动态代理,代理模式都可以在不改变目标对象的情况下,为其添加额外的功能,提高代码的可复用性和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值