1概述
代理模式是23种设计模式中现实和容易理解的设计模式。简而言之,A通过B的代理与C通信。例如:
当然这样看来,A和C通信的效率不是提高了,而是多了一层代理,A多了会怎么样?
显然,这样只能与B和C通信。像增加了一层的代理层一样,特别是为了处理请求。另一个现实的例子是:
如果有人想找你,你可以直接和他对话,如果一群人想找你,你必须不能和他们同时对话,需要一个回复。例如,我们平时的移动联系微信,这时他可以代理你接收和回复信息。例如:
据此总结了代理模型的概念和优点。
定义:提供控制对其他对象的访问的代理。
在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
优点:(1)职责清晰 (2)高扩展性(3)智能化
2 代理模式(静态代理)
静态代理简单的说就是接口代理实现类,当一个或多个类实现一个接口后,需要将接口的方法进行实现,当类进行实例化时使用接口进行代理方法的实现,直接调用接口的方法而不是实现类的方法。
/**
* 代理模式(静态代理)
*
* @author 17122
*/
public class StaticProxy {
public static void main(String[] args) {
People people = new Programmer();
();
}
}
interface People {
/**
* sayHello方法
*/
void sayHello();
}
class Student implements People {
@Override
public void sayHello() {
Sy("Hello I am a Student");
}
public void study() {
Sy("Study");
}
}
class Programmer implements People {
@Override
public void sayHello() {
Sy("Hello I am a Programmer");
}
public void playCode() {
Sy("Play code");
}
}
3 动态代理
动态代理的实现较为复杂,因为要实现动态代理就需要依托Java的反射机制,就是JDK官方原生的代理,继承InvocationHandler接口,实现invoke方法,就可以自定义代理工具类,根据不同的类进行动态的代理。
/**
* 动态代理
*
* @author 17122
*/
public class DynamicProxy {
public static void main(String[] args) {
Boos boos = new Boos();
Worker worker = new Worker();
getDynamicProxy(worker, Worker.class);
getDynamicProxy(boos, Boos.class);
}
/**
* 动态代理实现方法
*
* @param obj
* @param clazz
*/
public static void getDynamicProxy(Object obj, Class clazz) {
MyInvocationHandler myInvocationHandler = new MyInvocationHandler(obj);
Courier instance = (Courier) Proxy.newProxyInstance(), clazz.getInterfaces(), myInvocationHandler);
in();
}
}
/**
* 快递员
*/
interface Courier {
/**
* 取东西
*/
void takeSomething();
}
class Worker implements Courier {
@Override
public void takeSomething() {
Sy("Worker take Something");
}
}
class Boos implements Courier {
@Override
public void takeSomething() {
Sy("Boos take Something");
}
}
class MyInvocationHandler implements InvocationHandler {
/**
* 被代理的目标类
*/
private Object target;
/**
* 构造方法 放入目标类
*
* @param target
*/
public MyInvocationHandler(Object target) {
= target;
}
/**
* Returns an instance of a proxy class for the specified interfaces that dispatches method invocations to the specified invocation handler.
* 返回指定接口的代理类实例,该接口将方法调用分派给指定的调用处理程序。
*
* @param proxy the class loader to define the proxy class 定义代理类的类装入器
* @param method the list of interfaces for the proxy class to implement 代理类要实现的接口列表
* @param args the invocation handler to dispatch method invocations to 将方法调用分派到的调用处理程序
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = me(target, args);
return result;
}
}
4 静态代理和动态代理有什么不同
(1)最主要的不同就是动态代理依靠反射机制,可以在程序运行的过程中进行被代理对象的确定,而静态代理在程序编译时期就已经确定。
(2)静态代理需要自己写代码进行完成,而动态代理就是通过Proxy.newInstance()生成。
1.文章《什么叫代理,什么是代理记账公司!》援引自互联网,为网友投稿收集整理,仅供学习和研究使用,内容仅代表作者本人观点,与本网站无关,侵删请点击页脚联系方式。
2.文章《什么叫代理,什么是代理记账公司!》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
相关推荐
- . 现代买票为什么带上携程保险
- . 潮阳怎么去广州南站
- . 湖南马拉河怎么样
- . 烧纸为什么到三岔路口
- . 百色为什么这么热
- . 神州租车怎么样
- . 芜湖方特哪个适合儿童
- . 护肤品保养液是什么类目
- . 早晚的护肤保养有哪些项目
- . 女孩护肤品怎么保养的最好