代理模式

一、代理模式说明:

1.      什么情况下使用代理模式?想在B中访问A中的方法,但是BA没有直接的关系,这时,可以通过B访问代理C,而代理C可以直接访问A中的方法,就可以采用代理模式。如下图所示:

代理模式

 

2.      代理模式主要分为三个部分:主题接口、代理主题、真实主题。代理模式的结构图如下图所示:

代理模式

 

二、Java语言描述

package com.solid.pattern;

/**

 * 代理模式(主题接口)

 * @author solid

 */

public interface Subject {

 

    public void doSubject();

}

 

package com.solid.pattern;

/**

 * 代理模式(代理主题)

 * @author solid

 */

public class ProxySubject implements Subject {

 

    private RealSubject realSubject;

   

    public void doSubject() {

       preDoSubject();

       if(realSubject == null) {

           realSubject = new RealSubject();

       }

       realSubject.doSubject();

       aftDoSubject();

    }

 

    private void aftDoSubject() {

       System.out.println("===aftDoSubject===");

      

    }

 

    private void preDoSubject() {

       System.out.println("===preDoSubject===");

    }  

}

 

package com.solid.pattern;

/**

 * 代理模式(真实主题)

 * @author solid

 */

public class RealSubject implements Subject {

 

    public void doSubject() {

       System.out.println("===通过代理调用此方法===");

    }  

}

 

package com.solid.pattern;

/**

 * 代理模式(测试方法)

 * @author solid

 */

public class TestProxy {

 

    public static void main(String[] args) {

       Subject subject = new ProxySubject();

       subject.doSubject();

    }

}

 

三、代理模式的应用

假设有这样一个需求,写一个用户登录模块,要求用户登录前,检查用户的合法性,是否允许登录。如果不合法,不允许登录,反之,如果登录后,记录用户的登录日志。(使用代理模式实现)。示意性的代码可以如下描述:

package com.solid.pattern;

/**

 * 代理模式(登陆接口)

 * @author solid

 */

public interface Login {

   

    public String login();

}

 

package com.solid.pattern;

/**

 * 代理模式(真实登陆)

 * @author solid

 */

public class RealLogin implements Login {

   

    public String login() {

       //用户登录信息记录

       return null;

    }

}

 

package com.solid.pattern;

/**

 * 代理模式(代理登陆)

 * @author solid

 */

public class ProxyLogin implements Login {

    private RealLogin realLogin;

    private Check check;

    private Logger logger;

    private String result;

   

    public String login() {    

       if(check.check()) {

           realLogin.login();

           result = logger.logger();

       } else {

           return null;

       }

       return result;

    }

}

 

package com.solid.pattern;

/**

 * 有效性验证类

 * @author solid

 */

public class Check {

   

    private String username;

    private String password;

   

    public boolean check() {

       if(username.equals("admin") && password.equals("admin")) {

           return true;

       } else {

           return false;

       }

    }

}

 

package com.solid.pattern;

/**

 * 登陆日志记录类

 * @author solid

 */

public class Logger {

    private String logger;

    public String logger() {

       //记录日志

       return logger;

    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值