zoukankan      html  css  js  c++  java
  • 设计模式--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();
        }
    }
  • 相关阅读:
    大华解码器二次开发/C#调用C++DLL
    C# 获取网站页面的句柄
    C# 字节数组 字符数组 字符串 Byte[] Char[] String
    C# 结构体数组 C++ DLL
    Django
    Djano
    Django
    数据分析 02 -Pandas
    数据分析-01 Numpy
    02-正则和xpath
  • 原文地址:https://www.cnblogs.com/fubaizhaizhuren/p/5674304.html
Copyright © 2011-2022 走看看