设计模式--5.2 代理模式--普通代理

1. 普通代理就是我们要知道代理类(Subject)的存在,然后才能访问

(1)调用者只知道代理存在就可以, 不用知道代理了谁
(2) 屏蔽了真实角色(RealSubject)的变更对高层类(场景类)的影响

(3)真实的主题角色想怎么修改就怎么修改, 对高层次的模块没有任何的影响,只要你实现了接口所对应的方法, 该模式非常适合对扩展性要求较高的场合。

 2. 

(1) 接口类

package com.design.代理模式.第一阶段;

public interface IGamePlayer {
    void login(String username , String pwd);
    
    void killBoss();
    
    void upgrade();
}    
View Code

(2)真实角色

package com.design.代理模式.普通代理;

import com.design.代理模式.第一阶段.IGamePlayer;

public class GamePlayer implements IGamePlayer {
    private String name = "";
    
    
    public GamePlayer(IGamePlayer _gamePlayer , String _name) throws Exception{
         
        // 只有代理才能创建对象
        if(_gamePlayer != null && _gamePlayer.getClass().getName().equals("com.design.代理模式.普通代理.GamePlayerProxy")){
            this.name = _name;
            
        }else{
            throw new Exception("不能创建真实角色");
        }
    }

    // 登录
    @Override
    public void login(String username, String pwd) {
        System.out.println("GamePlayer:"+ name +" login.....");

    }

    // 杀怪
    @Override
    public void killBoss() {
        System.out.println("GamePlayer:"+ name +" killBoss.....");

    }

    // 升级
    @Override
    public void upgrade() {
        System.out.println("GamePlayer: "+ name +" upgrade.....");

    }

}
View Code

(3)proxy

package com.design.代理模式.普通代理;

import com.design.代理模式.第一阶段.IGamePlayer;

public class GamePlayerProxy implements IGamePlayer {
    private IGamePlayer gamePlayer = null;
    
    

     public GamePlayerProxy(String name ) throws Exception{
         gamePlayer = new GamePlayer(this,name);
     }
    
    // 通过构造函数决定要对谁进行代练
    public GamePlayerProxy(IGamePlayer _gamePlayer) {
        super();
        this.gamePlayer = _gamePlayer;
    }

    // 代练登录
    @Override
    public void login(String username, String pwd) {
        this.gamePlayer.login(username, pwd);
    }

    // 代练杀怪
    @Override
    public void killBoss() {
        this.gamePlayer.killBoss();
    }

    // 代练升级
    @Override
    public void upgrade() {
        this.gamePlayer.upgrade();
    }

}
View Code

(4) 场景类

package com.design.代理模式.普通代理;

import com.design.代理模式.第一阶段.IGamePlayer;

public class Client {
    public static void main(String[] args) throws Exception {
        // 调用者只知道代理存在就可以, 不用知道代理了谁
        // 屏蔽了真实角色(RealSubject)的变更对场景类的影响
        /*
         * 真实的主题角色想怎么修改就怎么修改, 对高层次的模
            块没有任何的影响, 只要你实现了接口所对应的方法, 该模式非常适合对扩展性要求较高的
            场合。 当然, 在实际的项目中, 一般都是通过约定来禁止new一个真实的角色, 这也是一个
            非常好的方案。
         */
        IGamePlayer proxy = new GamePlayerProxy("lvyf");
        
        proxy.login("lvyafei", "123456");
        proxy.killBoss();
        proxy.upgrade();
    }
}
原文地址:https://www.cnblogs.com/fubaizhaizhuren/p/5674304.html