设计模式之代理模式与动态代理

定义:为另一个对象提供一个替身或占位符以控制这个对象的访问。使用代理模式创建代表对象,让代表对象控制某对象的访问,被代理对象可以是远程的对象,创建开销大的对象或需要安全控制的对象。使用代理模式的两个目的:一是保护对象二是增强对象

首先看个类图:

Subject 是顶层接口,RealSubject 是真实对象(被代理对象),Proxy 是代理对象,代理对象持有被代理对象的引用,客户端调用代理对象方法,同时也调用被代理对象的方

法,但是在代理对象前后增加一些处理。在代码中,我们想到代理,就会理解为是代码 增强,其实就是在原本逻辑前后增加一些逻辑,而调用者无感知。代理模式属于结构型
模式,有静态代理和动态代理。

 


 

 


 

使用JDKProxy创建一个代理。


//每个城镇都需要配对服务
public interface PersonBean{


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



    void setName();
    void setGender();
    void setInterests();
    void setHotOrNotRating();




}


public class PersonBeanImpl implments PersonBean{

     String name;
    String gender;
    String interests;
    int rating;
    int ratingCount = 0;
//set
//get省略

public int getHotOrNotRating(){
        if(ratingCount == 0){

            return 0;
        }

        return rating/ratingCount;
}
    


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

       
}


//在我们的约会服务中,我们希望顾客可以设置自己的信息,同时又防止他人修改
//HorOrNot 评分则相反,不能自己评价,但是他人可以设置
//这是一种根据访问权限决定客户可否访问对象的代理

}

具体的例子

public class OwnerInvocationHandler implments InvocationHandler{


    PersonBean person;

    public OwnerInvocationHandler (PersonBean person) {


        this.person=person


    }


    public Object invoke(Object proxy,Meethod method,Object[]args)
                                    throw IllegalAccessException{


        if(method.getName().startWith("get")){

            return method.invoke(person,args);

        }esle if(method.getName().equals("setHotOrNotRating")){

                throw new IllegalAccessException();

        }else if(method.getName().startWith("set")){

            return method.invoke(person,args);

        }

        return null;

    }




   PersonBean getOwnerProxy(PersonBean person){



        return (PersonBean)proxu.newProxyInstance(

                person.getClass().getClassLoader(),
                person.getClass().getInterface(),
                new OwnerInvocationHandler(person)

                );


    }









}

关键的一点:动态代理之所以叫动态是因为运行时才将代理类创建出来,而不是运行时才将它实例化和handler联系起来的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值