代理模式

一、代理模式说明:

1. 什么情况下使用代理模式?想在B中访问A中的方法,但是BA没有直接的关系,这时,可以通过B访问代理C,而代理C可以直接访问A中的方法,就可以采用代理模式。如下图所示:

代理模式

2. 代理模式主要分为三个部分:主题接口、代理主题、真实主题。代理模式的结构图如下图所示:

代理模式

二、Java语言描述

package com.solid.pattern;

/**

* 代理模式(主题接口)

* @author solid

*/

public interface Subject {

public void doSubject();

}

package com.solid.pattern;

/**

* 代理模式(代理主题)

* @author solid

*/

public class ProxySubject implements Subject {

private RealSubject realSubject;

public void doSubject() {

preDoSubject();

if(realSubject == null) {

realSubject = new RealSubject();

}

realSubject.doSubject();

aftDoSubject();

}

private void aftDoSubject() {

System.out.println("===aftDoSubject===");

}

private void preDoSubject() {

System.out.println("===preDoSubject===");

}

}

package com.solid.pattern;

/**

* 代理模式(真实主题)

* @author solid

*/

public class RealSubject implements Subject {

public void doSubject() {

System.out.println("===通过代理调用此方法===");

}

}

package com.solid.pattern;

/**

* 代理模式(测试方法)

* @author solid

*/

public class TestProxy {

public static void main(String[] args) {

Subject subject = new ProxySubject();

subject.doSubject();

}

}

三、代理模式的应用

假设有这样一个需求,写一个用户登录模块,要求用户登录前,检查用户的合法性,是否允许登录。如果不合法,不允许登录,反之,如果登录后,记录用户的登录日志。(使用代理模式实现)。示意性的代码可以如下描述:

package com.solid.pattern;

/**

* 代理模式(登陆接口)

* @author solid

*/

public interface Login {

public String login();

}

package com.solid.pattern;

/**

* 代理模式(真实登陆)

* @author solid

*/

public class RealLogin implements Login {

public String login() {

//用户登录信息记录

return null;

}

}

package com.solid.pattern;

/**

* 代理模式(代理登陆)

* @author solid

*/

public class ProxyLogin implements Login {

private RealLogin realLogin;

private Check check;

private Logger logger;

private String result;

public String login() {

if(check.check()) {

realLogin.login();

result = logger.logger();

} else {

return null;

}

return result;

}

}

package com.solid.pattern;

/**

* 有效性验证类

* @author solid

*/

public class Check {

private String username;

private String password;

public boolean check() {

if(username.equals("admin") && password.equals("admin")) {

return true;

} else {

return false;

}

}

}

package com.solid.pattern;

/**

* 登陆日志记录类

* @author solid

*/

public class Logger {

private String logger;

public String logger() {

//记录日志

return logger;

}

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值