文章目录
前言
文章内容主要参考了刘伟主编的《设计模式(第2版)》,同时也结合了自己的一些思考和理解,希望能帮到大家。
本篇讲解代理模式,代理模式是非常重要而且也是我们经常能见到的设计模式,比如Spring里面的AOP就是利用了动态代理模式。最重要的是理解方法的增强其实是把业务给分隔开来。
正文
一、定义
代理模式(Proxy Pattern) :给某一个对象提供一个代理,并由代理对象控制对原对象的引用,属于对象结构型模式。
代理对象可以在客户端和目标对象之间起到中介的作用,通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外的新服务。
在这里我们要知道几点:1.代理的理解中,就像房产中介代理卖房,它除了要去做原本房东要做的事情包括报价销售,代理往往还会额外的去做不同的事情,比如宣传和办理等等。
所以代理模式增加了一个中介,同时它会去做原本没有中介的事情(说明要有原本的实体类去引用),接着往往会有额外增强的内容(代理对象自己定义的增强业务)。
二、情景假设
在一个论坛中已注册用户和游客的权限不同,已注册的用户拥有发帖、修改自己的注册信息、修改自己的帖子等功能;而游客只能看到别人发的帖子,没有其他权限。使用代理模式来设计该权限管理模块,可以给不同的用户提供不同级别的使用权限。
分析就是,有个代理类,其中会有原本用户的各种功能,同时会有增强的业务如:检查权限及开放权限。
三、情景分析
关于上面情景的类图(具体分析在下面)
首先定义一个抽象权限类
//抽象权限类 AbstrctPermission
public interface AbstrctPermission
{
public void modifyUserInfo();
public void viewNote();
public void publishNote();
public void modifyNote();
public void setLevel(int level);
}
具体真实的权限类
//真实权限类 RealPermission
public class RealPermissionextends implements AbstractPermission{
public void modifyUserInfo(){
System.out.println("修改用户信息");
}
public void viewNote(){
}
public void publishNote(){
System.out.println("发布新帖!");
}
public void modifyNote(){
System.out.println("修改发帖内容!");
}
public void setLevel(int level){
}
}
1.好了接下来就是定义代理类,代理类对于客户端来说是透明的,所以我们选择实现抽象类的方式,那么当客户端在面向抽象编程也会觉得代理类和普通真实类是一致的。
2.接着就是代理类要有原本没有代理时候的功能和业务,所以这里我们利用关联的方式去引用一个具体实现的真实权限类。
3.最后就是要有增强的业务定义。
//代理类
public class PermissionProxy implements AbstractPermission{
private RealPermission permisssion = new RealPermission();
private int level = 0;
public void modifyUserInfo(){