设计模式之代理模式

代理模式讲解和JDK自带的代理模式

模式动机

当直接访问某些对象时存在问题,可以通过一个代理对象来间接。

或者说,在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称为代理的第三者来实现间接引用。

定义

给某一个对象提供一个代理,并由代理对象控制对原对象的引用。

实现代理模式,需要代理类PermissionProxy和被代理类RealPermission实现共同的接口(父类),在PermissionProxy中有RealPermission 的一个实例,用户通过调用PermissionProxy的一个对象完成相应功能。此时PermissionProxy跟RealPermission 是组合关系。

实际问题

在一个论坛中,游客跟已注册角色的权限不同。已注册的用户可以发帖、修改信息和修改自己的帖子等;游客只能看别人的帖子。

尝试用代理模式实现这个玩意儿。

这里需要设计一个高级抽象层,有发帖、修改信息、修改帖子和设置等级的定义。
RealPermission可以完成这些功能,但是RealPermission不能被两种角色共同使用。
使用PermissionProxy作为完成功能的真正对象。

类图和模式结构

  • Subject(抽象主题角色):AbstractPermission
  • Proxy(代理角色):RealPermission
  • RealSubject(真正主题角色):PermissionProxy

设计模式之代理模式_第1张图片

Demo

设计模式的理解就是可以多看看定义、类图和代码!

public interface AbstractPermission {
     
    void modifyUserInfo();

    void viewNote();

    void publish();

    void modifyNote();

    void setLevel(int level);
}
public class RealPermission implements AbstractPermission{
     
    @Override
    public void modifyUserInfo() {
     
        System.out.println("修改用户信息~");
    }

    @Override
    public void viewNote() {
     

    }

    @Override
    public void publish() {
     
        System.out.println("发布新帖~");
    }

    @Override
    public void modifyNote() {
     
        System.out.println("修改发布内容~");
    }

    @Override
    public void setLevel(int level) {
     

    }
}
public class PermissionProxy implements AbstractPermission{
     
    private RealPermission realPermission = new RealPermission();

    private int level;
    @Override
    public void modifyUserInfo() {
     
        if (0 == level) {
     
            System.out.println("权限不足,请充值~");
        } else if (1 == level) {
     
            realPermission.modifyUserInfo();
        }
    }

    @Override
    public void viewNote() {
     
        System.out.println("查看帖子~");
    }

    @Override
    public void publish() {
     
        if (0 == level) {
     
            System.out.println("权限不足,请充值~");
        } else if (1 == level) {
     
            realPermission.publish();
        }
    }

    @Override
    public void modifyNote() {
     
        if (0 == level) {
     
            System.out.println("权限不足,请充值~");
        } else if (1 == level) {
     
            realPermission.modifyNote();
        }
    }

    @Override
    public void setLevel(int level) {
     
        this.level = level;
    }
}
public class ProxyDemo {
     
    public static void main(String[] args) {
     
        AbstractPermission permissionProxy = new PermissionProxy();
        permissionProxy.modifyNote();
        permissionProxy.modifyUserInfo();
        permissionProxy.publish();
        permissionProxy.setLevel(1);
        permissionProxy.modifyUserInfo();
        permissionProxy.modifyNote();
        permissionProxy.publish();
    }
}

展示:
设计模式之代理模式_第2张图片

JDK自带代理模式使用

JDK自带的代理方式是代理类需要实现InvocationHandler接口,实现invoke的方法。

步骤:

  • 创建共有的父类
  • 有个被代理类
  • 编写代理类,并实现InvocationHandler,重写invoke方法
//共有接口
public interface AbstractUser {
     
    void talk();
}
//被代理类
public class RealUser implements AbstractUser{
     
    @Override
    public void talk() {
     
        System.out.println("我一眼就看出你不是人!!!");
    }
}
//代理类
public class ProxyUser implements InvocationHandler{
     
    private Object object;

    public ProxyUser(Object object) {
     
        this.object = object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
     
        System.out.println("大胆妖孽!!!");
        //这里就会调用到被代理类的方法
        method.invoke(object, args);
        System.out.println("大威天龙!!!");
        System.out.println("飞龙在天~~~");
        System.out.println("去!!!");
        return null;
    }
}
public class JdkDemo {
     
    public static void main(String[] args) {
     
        //这个user对象是ProxyUser的对象
        AbstractUser user = (AbstractUser)Proxy.newProxyInstance(ProxyUser.class.getClassLoader(),
                new Class[]{
     AbstractUser.class}, new ProxyUser(new RealUser()));
        user.talk();
    }
}

设计模式之代理模式_第3张图片

你可能感兴趣的:(设计模式)