美文网首页
代理模式

代理模式

作者: 阳光的技术小栈 | 来源:发表于2018-01-22 15:13 被阅读5次

代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问。

示例—建立评价系统

每个人都有基本属性,包括:名字、性别、兴趣、评价率。需要对每个人的访问进行控制,对名字、性别、兴趣只能自己修改,别人不能修改。评价必须由其他人访问,自己不能评价。

UML图表示

代理模式

代码演示

人的接口

package Proxy;

public interface PersonBean {

    String getName();
    String getGender();
    String getInterests();
    int getHotOrNotRating();

    void setName(String name);
    void setGender(String gender);
    void setInterests(String interests);
    void setHotOrNotRating(int rating);
}

人的实现类

package Proxy;

public class PersonBeanImpl implements PersonBean {

    String name;
    String gender;
    String interests;
    int rating;
    int ratingCount = 0;

    @Override
    public String getName() {
        return name;
    }

    @Override
    public String getGender() {
        return gender;
    }

    @Override
    public String getInterests() {
        return interests;
    }

    @Override
    public int getHotOrNotRating() {
        if (ratingCount == 0) return 0;
        return (rating / ratingCount);
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public void setInterests(String interests) {
        this.interests = interests;
    }

    @Override
    public void setHotOrNotRating(int rating) {
        this.rating += rating;
        ratingCount++;
    }
}

拥有者的动态调用类

package Proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class OwnerInvocationHandler implements InvocationHandler {

    PersonBean person;

    public OwnerInvocationHandler(PersonBean person){
        this.person = person;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException {
        try {
            if (method.getName().startsWith("get")){
                return method.invoke(person,args);
            }
            else if (method.getName().equals("setHotOrNotRating")){
                throw new IllegalAccessException();
            }
            else if (method.getName().startsWith("set")){
                return method.invoke(person,args);
            }
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return null;
    }
}

非拥有者的动态调用类

package Proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class NonOwnerInvocationHandler implements InvocationHandler {

    PersonBean person;

    public NonOwnerInvocationHandler(PersonBean person){
        this.person = person;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException {

        try {
            if (method.getName().startsWith("get")){
                return method.invoke(person,args);
            }
            else if (method.getName().equals("setHotOrNotRating")){
                return method.invoke(person,args);
            }
            else if (method.getName().startsWith("set")){
                throw  new IllegalAccessException();
            }
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        return null;
    }
}

测试代码

package Proxy;

import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.Map;

public class CommentTestDrive {

    Map<String,PersonBean> data;

    /**
     * 动态生成拥有者代理类
     * @param person
     * @return
     */
    PersonBean getOwnerProxy(PersonBean person){
        return (PersonBean) Proxy.newProxyInstance(person.getClass().getClassLoader(),
                person.getClass().getInterfaces(),new OwnerInvocationHandler(person));
    }

    /**
     * 动态生成非拥有者代理类
     * @param person
     * @return
     */
    PersonBean getNonOwnerProxy(PersonBean person){
        return (PersonBean) Proxy.newProxyInstance(person.getClass().getClassLoader(),
                person.getClass().getInterfaces(),new NonOwnerInvocationHandler(person));
    }

    /**
     * 初始化数据
     */
    void initializeDatabase(){
        data = new HashMap<String, PersonBean>();

        PersonBean person = new PersonBeanImpl();
        person.setName("Joe Javabean");
        person.setGender("male");
        person.setInterests("swimming");
        person.setHotOrNotRating(7);

        data.put("Joe", person);
    }

    public CommentTestDrive(){
        initializeDatabase();
    }

    public void drive(){
        PersonBean joe = data.get("Joe");

        System.out.println("His info is :");
        System.out.println("name is " + joe.getName());
        System.out.println("gender is " + joe.getGender());
        System.out.println("interests is " + joe.getInterests());
        System.out.println("rating is " + joe.getHotOrNotRating());
        System.out.println("~~~~~~~~~~~~~~~");

        PersonBean ownerProxy = getOwnerProxy(joe);
        System.out.println("Name is " + ownerProxy.getName());
        ownerProxy.setInterests("bowling, Go");
        System.out.println("Interests set from owner proxy");
        try {
            ownerProxy.setHotOrNotRating(10);
        }
        catch (Exception e){
            System.out.println("Can't set rating from owner proxy");
        }
        System.out.println("Rating is " + ownerProxy.getHotOrNotRating());

        PersonBean nonOwnerProxy = getNonOwnerProxy(joe);
        System.out.println("Name is " + nonOwnerProxy.getName());
        try {
            nonOwnerProxy.setInterests("bowling, Go");
        }
        catch (Exception e){
            System.out.println("Can't set interests from non owner proxy");
        }

        nonOwnerProxy.setHotOrNotRating(3);
        System.out.println("Rating set from non owner proxy");
        System.out.println("Rating is " + nonOwnerProxy.getHotOrNotRating());


        System.out.println("~~~~~~~~~~~~~~~");
        System.out.println("Now his info is :");
        System.out.println("name is " + joe.getName());
        System.out.println("gender is " + joe.getGender());
        System.out.println("interests is " + joe.getInterests());
        System.out.println("rating is " + joe.getHotOrNotRating());

    }

    public static void main(String[] args) {
        CommentTestDrive drive = new CommentTestDrive();
        drive.drive();
    }

}

测试结果

His info is :
name is Joe Javabean
gender is male
interests is swimming
rating is 7
~~~~~~~~~~~~~~~
Name is Joe Javabean
Interests set from owner proxy
Can't set rating from owner proxy
Rating is 7
Name is Joe Javabean
Can't set interests from non owner proxy
Rating set from non owner proxy
Rating is 5
~~~~~~~~~~~~~~~
Now his info is :
name is Joe Javabean
gender is male
interests is bowling, Go
rating is 5

相关文章

  • 设计模式

    单例模式 模板方法模式 工厂模式 代理模式 静态代理 JDK动态代理

  • 设计模式

    单例模式 代理模式 静态代理 jdk动态代理 cglib动态代理 工厂模式 适配器模式 建造者模式 观察者模式

  • kube-proxy的3种模式

    userspace代理模式 iptables代理模式 IPVS代理模式 https://kubernetes.io...

  • 第4章 结构型模式-代理模式

    一、代理模式简介 二、代理模式3个角色 三、代理模式的优点 四、代理模式的实例(游戏代练)

  • 理解代理模式

    原创博客地址 简介 代理模式,也叫做委托模式,分为:静态代理动态代理 代理模式也是平时比较常用的设计模式之一,代理...

  • 结构型 代理模式(文末有项目连接)

    1:什么是代理模式 2:没用代理模式时的实例 3:使用代理模式将其解耦(静态代理) 3:使用代理模式将其解耦(动态...

  • 设计模式-动态代理模式

    之前介绍了代理模式,大家也都了解了代理模式,不过之前介绍的代理模式是静态代理,静态代理什么意思?静态代理指的是代理...

  • 代理模式

    一、什么是代理模式 代理模式(Proxy pattern):代理模式又叫委托模式,是为某个对象提供一个代理对象,并...

  • 设计模式之代理模式(Proxy模式)

    代理模式的引入 代理模式的实例程序 代理模式的分析 代理模式的引入 Proxy是代理人的意思,指的是代替别人进行工...

  • Java设计模式之代理模式

    Java设计模式之代理模式 代理模式 静态代理 动态代理 为什么需要代理 通过代理,我们能够不用知道委托人是谁,而...

网友评论

      本文标题:代理模式

      本文链接:https://www.haomeiwen.com/subject/tyhunxtx.html