• 设计模式--5.3 代理模式-强制代理


    1 .强制代理
      (1)强制代理是调用者直接调用真实角色,而不用关心代理类是否存在。其代理的产生是由真实角色决定的。
      (2) 通过真实角色,查找代理角色;再通过代理角色,调真实角色的方法

    2.代码

    (1)抽象类,多了一个getProxy方法

    package com.design.代理模式.强制代理;
    
    public interface IGamePlayer {
        
        void login(String username , String pwd);
        
        void killBoss();
        
        void upgrade();
        
        IGamePlayer getProxy();
    }
    View Code

    (2)真实角色

    package com.design.代理模式.强制代理;
    
    public class GamePlayer implements IGamePlayer {
        private String name = "";
        
        private IGamePlayer proxy = null;
        
        
        
        public GamePlayer(String name) {
            super();
            this.name = name;
        }
    
        @Override
        public IGamePlayer getProxy(){
            this.proxy = new GamePlayerProxy(this);
            return this.proxy;
        }
    
        @Override
        public void login(String username, String pwd) {
            if(this.isProxy()){
                System.out.println("name:" + name +" login....");
            }else{
                System.out.println("请使用代理");
            }
        }
    
        @Override
        public void killBoss() {
            if(this.isProxy()){
                System.out.println("name:" + name +" killBoss....");
            }else{
                System.out.println("请使用代理");
            }
        }
    
        @Override
        public void upgrade() {
            if(this.isProxy()){
                System.out.println("name:" + name +" upgrade....");
            }else{
                System.out.println("请使用代理");
            }
        }
    
         
        private boolean isProxy(){
            if(this.proxy == null){
                return false;
            }else{
                return true;
            }
        }
    }
    View Code

    (3)代理类

    package com.design.代理模式.强制代理;
    
    import java.util.Date;
    
    public class GamePlayerProxy implements IGamePlayer {
        private IGamePlayer gamePlayer = null;
        
        public GamePlayerProxy(IGamePlayer gamePlayer) {
            super();
            this.gamePlayer = gamePlayer;
        }
    
        @Override
        public void login(String username, String pwd) {
            System.out.println(username+"开始登录");
            this.gamePlayer.login(username, pwd);
            System.out.println(username+"登录完成");
        }
    
        @Override
        public void killBoss() {
            System.out.println("开始打怪" + new Date());
            this.gamePlayer.killBoss();
            Thread.currentThread();
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("打怪结束" + new Date());
        }
    
        @Override
        public void upgrade() {
            this.gamePlayer.upgrade();
            System.out.println("恭喜升级完成");
        }
    
        @Override
        public IGamePlayer getProxy() {
            return this;
        }
    
    }
    View Code

    (4)场景类

    package com.design.代理模式.强制代理;
    
    public class Client {
        public static void main(String[] args) {
            // 1.不使用代理,看结果,只能打印请使用代理
            IGamePlayer gp1 = new GamePlayer("lvyf");
            gp1.login("lvyf", "123");
            gp1.killBoss();
            gp1.upgrade();
            
            // 2.使用代理类,还是不行
            IGamePlayer gp2 = new GamePlayer("lvyf");
            IGamePlayer gp3 = new GamePlayerProxy(gp2);
            gp3.login("lvyf", "123");
            gp3.killBoss();
            gp3.upgrade();
            
            // 3. 通过真实角色,查找代理角色;再通过代理角色,调真实角色的方法
            IGamePlayer gp4 = new GamePlayer("lvyf");
            IGamePlayer proxy = gp4.getProxy();
            proxy.login("lvyf", "123");
            proxy.killBoss();
            proxy.upgrade();
        }
    }
  • 相关阅读:
    初探并行线程的三种写法
    Revit2017二次开发-打印机配置
    test错误记录
    自行车出租系统错误集2
    错误记录-spring+mybatis
    Windows(64位IIS)未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
    sqlDeveloper连接oracle
    Apriori算法-java
    Apriori算法-位运算-C语言
    Apriori算法-数组-C语言
  • 原文地址:https://www.cnblogs.com/fubaizhaizhuren/p/5674338.html
Copyright © 2020-2023  润新知