代理模式

来源:互联网 发布:淘宝窗帘店 编辑:程序博客网 时间:2024/05/21 08:34

百度百科


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


组成:

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

抽象角色

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();    }}
原创粉丝点击