设计模式-结构型模式之代理模式

105 阅读1分钟

结构型模式-代理模式

image.png

代理模式

代理模式:通过代理对象可以操作真实对象,并且代理对象可以对真实对象的操作前后做一些增强操作。

image.png

举个例子:以玩游戏来说,自己一个人升级太慢了,又不想浪费时间,又想尽快升级到满级,这个时候就可以找代练去帮他升级,如下图:

image.png

在这个案例中:被代理对象就是玩家张三、代理对象就是代练、被代理对象需要操作的就是玩游戏这个抽象类。

实现

抽象类

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();  
    }  
}

贴一张类图

image.png


代理模式的优点:

  • 职责清晰,真实对象只需要完成自己的职责,添加额外的功能交给代理对象
  • 扩展性强,真实对象只要实现了接口,代理对象都可以进行代理

代理模式扩展:

  • 静态代理(本文案例)
  • 动态代理---重点,想了解的可以先百度了解
    • JDK动态代理
    • Cglib动态代理