`

设计模式之代理模式

阅读更多

代理模式是一种使用率非常高的模式,定义如下:为其他对象提供一种代理以控制这个对象的访问。



 

 

从通用类图中可以看出代理模式涉及到三个类:

1.Subject抽象主题角色

抽象主题类可以是抽象类也可以是接口,上面的类图使用的抽象类

 

2.具体主题角色

也可以称为被委托角色,是业务逻辑的具体执行者

 

3.Proxy代理角色

它负责对真是角色的应用,把所有抽象的主题类定义的方法限制委托给真是的主题角色实现,并且在真是的主题角色处理完毕前后做预处理和善后的工作

 

代码如下:

 

/**
 * 抽象主题类
 */
public abstract class Subject {

    // 抽象主题的方法
    protected abstract void request();
}

 

/**
 * 真实的主题角色
 * 
 */
public class RealSubject extends Subject {

    /**
     * 具体的实现逻辑
     */
    @Override
    protected void request() {

        System.out.println("收到请求....");
    }

}

 

/**
 * 代理类
 * 
 */
public class Proxy extends Subject {

    private Subject subject;

    public Proxy(Subject subject) {
        this.subject = subject;
    }

    /**
     * 代理类同真是的主题角色实现同一个抽象类或者接口,
     *  因为代理类是要代理真实的角色,既然是代理,那么代理就应该具有真是角色拥有的功能
     */
    @Override
    protected void request() {

        System.out.println("开始时间");
        subject.request();
        System.out.println("结束时间");
    }

}

 

public class Client {

    public static void main(String[] args) {
    
       Proxy proxy=new Proxy(new RealSubject());
       
       proxy.request();
    }
}

 

可能有的人会说,我不用代理也能输出程序的执行时间啊,为什么非用代理呢,我们知道模式这种东西的出现主要是为了解决程序的复用性的、灵活性问题的,就拿输出程序的执行来说,如果我们有多个类都需要输出时间,我们只是将输出时间的功能硬编码到程序里,那么将来有一天程序要上线了需要我们去掉输出,那么想想你的工作量吧。

 

我们使用代理就是为了增强真是主题的执行逻辑,就想上面的代码中在真是逻辑执行前后输出时间一样,其实代理处理和真实主题除了必须继承或实现同一个接口外,代理类本身也可以单独继承或实现另一个接口。场景如下:

 

上一篇我们介绍的说的建造者模式中,小明最终花了5000元组装了一个电脑,现在几乎不上课,天天打游戏,可是有小明发现舍友小强平时不怎么打游戏,该上课上课,该泡妞泡妞,可是他的游戏级别却比自己的高,有一天宿舍在一起喝酒,小明就将自己的疑问说了出来,小强说:“你傻呀,你不知道游戏圈有代练啊”,小明这才恍然大悟,于是乎拿起手机就给他爸打了过说:“爸,学校需要买一些考试资料需要一点钱.....”,钱拿到之后,小明也找了代练,但是小明仍然不去上课,只是可以多睡一会了.....

 

上述场景的类图如下:

 



 

代码实现如下:

public interface GamePlayer {

    // 打怪
    public void daguai();

    // 升级
    public void upgrade();
}

 

/**
 * 小明
 *
 */
public class Xiaoming implements GamePlayer {

    /**
     * 打怪
     */
    @Override
    public void daguai() {

        System.out.println("开始打怪了.....");
    }

    /**
     * 升级
     */
    @Override
    public void upgrade() {

        System.out.println("升级了....");
    }

}

 

/**
 * 
 * 代练
 */
public class GamePlayerProxy implements GamePlayer, Billing {

    private GamePlayer player;

    public GamePlayerProxy(GamePlayer player) {

        this.player = player;
    }

    /**
     * 打怪
     */
    @Override
    public void daguai() {

        player.daguai();
    }

    /**
     * 升级
     */
    @Override
    public void upgrade() {

        player.upgrade();
        // 计费
        this.account();
    }

    /**
     * 计费
     */
    @Override
    public void account() {

        System.out.println("计费成功");
    }

}

 

/**
 * 计费接口
 * 
 */
public interface Billing {

    // 计费
    public void account();
}

 

/**
 * 
 * 
 */
public class Client {

    public static void main(String[] args) {

        Xiaoming xiaoming = new Xiaoming();

        GamePlayerProxy gamePlayerProxy = new GamePlayerProxy(xiaoming);

        gamePlayerProxy.daguai();

        gamePlayerProxy.upgrade();
    }
}

 

  • 大小: 30.1 KB
  • 大小: 36.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics