• 设计模式(五)—— 代理模式


    一、定义:

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

    二、特点:

    • 真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
    • 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
    • 高扩展性

    三、情景:

    玩游戏时,有些玩家需要上班,但又想尽快升级,于是就在淘宝上找游戏代理,来帮他升级,根据该情景来设计类。

    1、游戏接口类(Game)

    public interface Game {
    
        void login(Player play);
    
        void play();
    
    }
    
    

    2、游戏实现类(GameImpl)

    public class GameImpl implements Game{
    
        Player player;
    
        public void login(Player play) {
            this.player = play;
            System.out.println("欢迎【"+play.getUserName()+"】来到游戏世界");
        }
    
        public void play() {
            int level = player.getLevel()+1;
            System.out.println("恭喜升到【"+level+"】级");
    
        }
    }
    
    

    3、玩家类(Player)

    private String userName;
        private String passWord;
        private Integer level;
    
        public Player(){
    
        }
    
        public Player(String userName, String passWord) {
            this.userName = userName;
            this.passWord = passWord;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getPassWord() {
            return passWord;
        }
    
        public void setPassWord(String passWord) {
            this.passWord = passWord;
        }
    
        public Integer getLevel() {
            return level;
        }
    
        public void setLevel(Integer level) {
            this.level = level;
        }
    

    4、代理类(Proxy)

    public class Proxy implements Game{
    
        Game game = new GameImpl();
    
        public void startProxy(Player player){
            this.login(player);
            this.play();
        }
    
        public void login(Player player) {
            game.login(player);
        }
    
        public void play() {
            game.play();
        }
    }
    

    5、代理模拟玩家登录测试类

    public class ProxyGame {
    
        public static void main(String[] args) {
            Player player = new Player("fonxian","123456");
            player.setLevel(0);
            Proxy proxy = new Proxy();
            proxy.startProxy(player);
            /**
             * 输出结果
             * 欢迎【fonxian】来到游戏世界
               恭喜升到【1】级
             */
        }
    
    }
    
  • 相关阅读:
    接口方法上的注解无法被@Aspect声明的切面拦截的原因分析
    SpringBoot整合Netty
    简单的RPC框架
    基于redis的分布式锁的分析与实践
    8种方案解决重复提交问题
    领券中心项目,如何用 Redis 做实时订阅推送的?
    IM(即时通讯)服务端(二)
    IM(即时通讯)服务端(一)
    0xC00000FD: Stack overflow (parameters: 0x00000000, 0x003E2000).错误
    int (*a)[10]和int *a[10]的区别
  • 原文地址:https://www.cnblogs.com/fonxian/p/5731154.html
Copyright © 2020-2023  润新知