您的位置:首页 > 编程语言 > Java开发

Java设计模式之代理模式

2016-08-29 00:00 176 查看
定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

特点:

1、真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。

2、代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。

3、扩展性高

企业级开发和常用框架中的应用:最著名的就是spring的aop,还有spring的bean的创建其实也用到了代理

代理模式分为了动态代理和静态代理,动态代理是开发中应用的特别多。

静态代理:

/**
* 以买房举例
*/
interface Actions {

/**
* 选房
*/
public void selectHouse();

/**
* 看房
*/
public void seeHouse();

/**
* 入住
*/
public void ruzhu();

}

class RealRole implements Actions{

public void selectHouse() {
System.out.println("用户自己选房");
}

public void seeHouse() {
System.out.println("用户自己看房");
}

public void ruzhu() {
System.out.println("用户自己入住");
}

}

class ProxyRole implements Actions{

private RealRole realRole;

public ProxyRole(RealRole realRole) {
this.realRole = realRole;
}

public void selectHouse() {
System.out.println("中介选房");
}

public void seeHouse() {
System.out.println("中介看房");
}

@Override
public void ruzhu() {
realRole.ruzhu();
}

}

public class Demo {

public static void main(String[] args) {
RealRole realRole = new RealRole();
ProxyRole proxyRole = new ProxyRole(realRole);
proxyRole.selectHouse();
proxyRole.seeHouse();
proxyRole.ruzhu();
}
}

动态代理:

/**
* 以买房举例
*/
interface Actions {

/**
* 选房
*/
public void selectHouse();

/**
* 看房
*/
public void seeHouse();

/**
* 入住
*/
public void ruzhu();

}

class RealRole implements Actions{

public void selectHouse() {
System.out.println("用户自己选房");
}

public void seeHouse() {
System.out.println("用户自己看房");
}

public void ruzhu() {
System.out.println("用户自己入住");
}

}

class Handler implements InvocationHandler{

private RealRole realRole ;

public Handler(RealRole realRole) {
this.realRole = realRole;
}

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(realRole);
System.out.println("中介选房,看房");
method.invoke(realRole, args);
return null;
}

}

public class Demo {

public static void main(String[] args) {
RealRole realRole = new RealRole();

Handler handler = new Handler(realRole);

Actions proxy = (Actions) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Actions.class}, handler);
proxy.ruzhu();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息