代理模式-代码实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式-代码实现相关的知识,希望对你有一定的参考价值。

概念:为其他对象提供一种代理以控制对这个对象的访问。

使用场景:增加一个对象操作的访问控制,如根据权限判断用户是否能执行某个方法. 另一个应用是延迟加载,比如图片的对象,直到真正改变图片文件时才真正加载.

 

一个带访问控制的代理例子:

//真正的执行对象

package note.com.proxy;

/**
 * 可执行动作
 * @author lxz
 *
 */
public class Action {
    
    public void doOne(){
        System.out.println("One");
    }
    public void doTwo(){
        System.out.println("Two");
    }
    public void doThree(){
        System.out.println("Three");
    }

}

//权限控制类

package note.com.proxy;

/**
 * 权限类
 * 
 * @author lxz
 *
 */
public class Permission {

    private boolean one = false;
    private boolean two = false;
    private boolean three = false;
    
    public Permission(boolean one,boolean two,boolean three){
        this.one = one;
        this.two = two;
        this.three = three;
    }
    
    public boolean isOne() {
        return one;
    }
    public void setOne(boolean one) {
        this.one = one;
    }
    public boolean isTwo() {
        return two;
    }
    public void setTwo(boolean two) {
        this.two = two;
    }
    public boolean isThree() {
        return three;
    }
    public void setThree(boolean three) {
        this.three = three;
    }
    
    
}

//对Action的代理类

package note.com.proxy;

/**
 * 代理Action类
 * @author lxz
 *
 */
public class Proxy {

    private Action action = null;
    private Permission permission = null;
    
    public Proxy(Permission permission){
        this.action = new Action();
        this.permission = permission;
    }
    
    public void doOne(){
        if(permission.isOne()){
            action.doOne();
        }
    }
    public void doTwo(){
        if(permission.isTwo()){
            action.doTwo();
        }
    }
    public void doThree(){
        if(permission.isThree()){
            action.doThree();
        }
    }
    public Action getAction() {
        return action;
    }
    public void setAction(Action action) {
        this.action = action;
    }
    public Permission getPermission() {
        return permission;
    }
    public void setPermission(Permission permission) {
        this.permission = permission;
    }
    
    
    
}

//测试类

package note.com.proxy;

public class ProxyTest {
    public static void main(String[] args) {
        Permission permission = new Permission(true,false,true);
        Proxy proxy = new Proxy(permission);
        proxy.doOne();
        proxy.doTwo();
        proxy.doThree();
    }
}

结果:

One
Three

真正的对象由代理对象去掉用,并且在代理对象中增加的访问控制

 

以上是关于代理模式-代码实现的主要内容,如果未能解决你的问题,请参考以下文章

代理模式-代码实现

设计模式——代理模式

Spring之代理模式

设计模式----代理模式

Java设计模式-代理模式之动态代理(附源代码分析)

关于代理模式的个人理解