前言:

上一篇说到了策略模式。单类图上来说,它和本篇要说的代理模式还真是有些像似。都需要一个公共的接口,还有一些实现类。代理类(包装类)封装了一个接口对象,提供客户端调用。这些都很类似。不过,有一个细节需要我们注意一下,那就是这里的代理类也需要去继承这里的公共接口。而在策略模式中,包装类则不需要这么做。

概述:

代理模式就是定义一个原对象的代理对象,来帮助原对象和系统之外的业务作沟通。也就是说,如果我们不能直接或是不愿直接去使用原对象,那么我们就可以使用创建一个原对象的代理来进行操作。

本文链接:http://blog.csdn.net/lemon_tree12138/article/details/50326817-- Coding-Naga
--转载请注明出处


模式说明:

举例--话题访问

1.背景

现在我们假设我们要构建一个网站。这个网站允许三类用户访问,分别是:普通注册成员、站长管理员、游客。

那么这个时候,各个不同的访问者对某一网页的内容都有不同的权限。比如,普通注册成员可以访问、发表和评论(回复)一个话题;站长管理员可以访问、发表、评论以及删除一个话题;而游客则只能访问这个网页。

2.类图


 

图-1 代理模式类图

根据上面例子中的需求,我们可以画出图-1中的类图。不过虽然类图中的三个实现类都有实现接口中所有方法,不过其实这些实现方法却不适合所有的访问者对象。比如,Member虽然有remove方法,不过普通会员并不能真的删除一个话题。所以这个控制就十分有必要了。

3.代码及说明:

1.公共接口

在公共接口中需要定义一些访问者的基本行为。分别是访问话题、发表话题、评论话题和删除话题。

 

  1. public interface Visitor {
  2. public void visit() throws RoleExcption;
  3. public void publish() throws RoleExcption;
  4. public void comment() throws RoleExcption;
  5. public void remove() throws RoleExcption;
  6. }

 

2.具体实现类

本例中具体实现类倒没什么太多的内容,只是重写了实现接口中的方法。

 

  1. public class Manager implements Visitor {
  2. @Override
  3. public void visit() {
  4. System.out.println("我是网站的管理员,我访问了这个主题");
  5. }
  6. @Override
  7. public void publish() {
  8. System.out.println("我是网站的管理员,我发表了一个主题");
  9. }
  10. @Override
  11. public void comment() {
  12. System.out.println("我是网站的管理员,我评论了一个主题");
  13. }
  14. @Override
  15. public void remove() {
  16. System.out.println("我是网站的管理员,我删除了一个主题");
  17. }
  18. }

 

3.代理类

代理类的作用还是比较重要,和必要的。他们负责来控制一个访问者对话题的行为,防止越权的行为。比如一个游客访问者是不能发表和评论话题的。那么可以通过代理中方法作控制方式来实现。如下:

 

  1. public class ProxyVisitor implements Visitor {
  2. private Visitor visitor = null;
  3. public ProxyVisitor() {
  4. // 默认情况是游客
  5. visitor = new Tourist();
  6. }
  7. public ProxyVisitor(Visitor _visitor) {
  8. visitor = _visitor;
  9. }
  10. @Override
  11. public void visit() throws RoleExcption {
  12. visitor.visit();
  13. }
  14. @Override
  15. public void publish() throws RoleExcption {
  16. if (visitor instanceof Tourist) {
  17. throw new RoleExcption("游客不能发表主题,请先注册帐号");
  18. }
  19. visitor.publish();
  20. }
  21. @Override
  22. public void comment() throws RoleExcption {
  23. if (visitor instanceof Tourist) {
  24. throw new RoleExcption("游客不能发表评论,请先注册帐号");
  25. }
  26. visitor.comment();
  27. }
  28. @Override
  29. public void remove() throws RoleExcption {
  30. if (!(visitor instanceof Manager)) {
  31. throw new RoleExcption("只有管理员才可以删除主题");
  32. }
  33. visitor.remove();
  34. }
  35. }