结构型模式-代理模式
代理模式
代理模式:通过代理对象可以操作真实对象,并且代理对象可以对真实对象的操作前后做一些增强操作。
举个例子:以玩游戏来说,自己一个人升级太慢了,又不想浪费时间,又想尽快升级到满级,这个时候就可以找代练去帮他升级,如下图:
在这个案例中:被代理对象就是玩家张三、代理对象就是代练、被代理对象需要操作的就是玩游戏这个抽象类。
实现
抽象类
public interface IGamePlayer {
void login(String username, String password);
void killBoss();
void upgrade();
}
被代理对象
public class GamePlayer implements IGamePlayer{
@Override
public void login(String username, String password) {
System.out.println("用户:"+username+",密码:"+password+",登录成功");
}
@Override
public void killBoss() {
System.out.println("开始杀怪.....");
}
@Override
public void upgrade() {
System.out.println("升级中.....");
}
}
代理对象
public class GamePlayerProxy implements IGamePlayer{
private IGamePlayer gamePlayer;
public GamePlayerProxy(IGamePlayer gamePlayer) {
this.gamePlayer = gamePlayer;
}
public void before(){
System.out.println("准备配置流畅的电脑.....");
}
@Override
public void login(String username, String password) {
before();
gamePlayer.login(username, password);
}
@Override
public void killBoss() {
gamePlayer.killBoss();
}
@Override
public void upgrade() {
gamePlayer.upgrade();
after();
}
public void after(){
System.out.println("帮助客户设置常用配置.....");
}
}
测试
public class Main {
public static void main(String[] args) {
IGamePlayer gamePlayer = new GamePlayer();
GamePlayerProxy gamePlayerProxy = new GamePlayerProxy(gamePlayer);
gamePlayerProxy.login("张三","123456");
gamePlayerProxy.killBoss();
gamePlayerProxy.upgrade();
}
}
贴一张类图
代理模式的优点:
- 职责清晰,真实对象只需要完成自己的职责,添加额外的功能交给代理对象
- 扩展性强,真实对象只要实现了接口,代理对象都可以进行代理
代理模式扩展:
- 静态代理(本文案例)
- 动态代理---重点,想了解的可以先百度了解
- JDK动态代理
- Cglib动态代理