代理模式

百度百科


代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。


组成:

  • 抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
  • 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
  • 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

抽象角色

public interface GiveGift {

    void giveDolls();
    void giveFlowers();
    void giveChocolate();

}

真实角色

public class Pursuit implements GiveGift{

    SchoolGird mm;

    public Pursuit(SchoolGird mm) {
        this.mm = mm;
    }

    public void giveDolls(){
        System.out.println("送洋娃娃");
    }

    public void giveFlowers(){
        System.out.println("送洋花");
    }

    public void giveChocolate(){
        System.out.println("送洋巧克力");
    }

}

代理角色

public class Proxy implements GiveGift{
    Pursuit pursuit;   //持有一个被代理角色对象的引用

    public Proxy(SchoolGird schoolGird) {
        this.pursuit = new Pursuit(schoolGird);
    }

    //代理角色中,可以添加新方法
    public void lookMovies() {
        System.out.println("看电影");
    }

    public void giveDolls(){
        System.out.println("送洋娃娃");
    }

    public void giveFlowers(){
        System.out.println("送洋花");
    }

    public void giveChocolate(){
        System.out.println("送洋巧克力");
    }

}

客户端代码

public class Main {

    public static void main(String[] args) {
        SchoolGird schoolGird = new SchoolGird();
        schoolGird.setName("文静");

        Proxy proxy = new Proxy(schoolGird);
        proxy.giveChocolate();
        proxy.giveDolls();
        proxy.giveFlowers();
        proxy.lookMovies();
    }
}

这里写图片描述


jdk代理、实现InvocationHandler接口

public class DynamicProxyTest {

    interface Ihello {
        void sayHello();
    }

    static class Hello implements Ihello {

        @Override
        public void sayHello() {
            System.out.println("hello world!");
        }

    }

    static class DynamicProxy implements InvocationHandler {

        Object originalObj;  //要被代理类的一个引用

        Object bind(Object originalObj) {
            this.originalObj = originalObj;
            return Proxy.newProxyInstance(originalObj.getClass().getClassLoader(), 
                    originalObj.getClass().getInterfaces(), this);
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("welcome");              //在调用实际类之前做的的事
            return method.invoke(originalObj, args);
        }

    }

    public static void main(String[] args) {
        Ihello ihello = (Ihello) new DynamicProxy().bind(new Hello());
        ihello.sayHello();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值