设计模式篇|代理模式

2019-08-13  本文已影响0人  青年心路
1.代理模式简介

通过在访问者和提供者中间添加一个代理,这样可以避免访问者直接与提供者的访问。例如:生活中找歌手唱歌,首先需要找到歌手的经纪人,通过经纪人联系歌手。其中经纪人就是一个代理。

作用
分类
动态代理相比于静态代理具有的优势:
2.静态代理的实现

这里使用明星和经纪人的例子进行表示

public interface Star {

    //面谈
    void confer();
    //签合同
    void signContract();
    //订票
    void bookTicket();
    //唱歌
    void sing();
    //收尾款
    void collectMoney();
}
/**
 * 明星本人
 */
public class RealStar implements Star {

    @Override
    public void confer() {
        System.out.println("真实角色面谈");
    }

    @Override
    public void signContract() {
        System.out.println("真实角色签合同");
    }

    @Override
    public void bookTicket() {
        System.out.println("真实角色订票");
    }

    @Override
    public void sing() {
        System.out.println("真实角色唱歌");
    }

    @Override
    public void collectMoney() {
        System.out.println("真实角色收尾款");
    }
}
/**
 * 经纪人
 */
public class ProxyStar implements Star {

    private Star star;

    public ProxyStar(Star star) {
        this.star = star;
    }

    @Override
    public void confer() {
        System.out.println("代理明星去面谈");
    }

    @Override
    public void signContract() {
        System.out.println("代理明星去签合同");
    }

    @Override
    public void bookTicket() {
        System.out.println("代理明星去订票");
    }

    @Override
    public void sing() {
        //唱歌行为经纪人无法代理,所以需要调用歌手
        star.sing();
    }

    @Override
    public void collectMoney() {
        System.out.println("代理明星收尾款");
    }
}
public class Client {

    public static void main(String[] args) {
        Star real = new RealStar();
        //实现了对真实角色的代理
        Star proxy = new ProxyStar(real);

        proxy.confer();
        proxy.signContract();
        proxy.bookTicket();
        //这里代理角色找真实角色进行相应的行为,此时调用者不需要知道内部流程
        proxy.sing();
        proxy.collectMoney();
    }
}

运行效果图


image.png
3.动态代理的实现(JDK)
public interface Star {

    //面谈
    void confer();
    //签合同
    void signContract();
    //订票
    void bookTicket();
    //唱歌
    void sing();
    //收尾款
    void collectMoney();
}
/**
 * 明星本人
 */
public class RealStar implements Star {

    @Override
    public void confer() {
        System.out.println("真实角色面谈");
    }

    @Override
    public void signContract() {
        System.out.println("真实角色签合同");
    }

    @Override
    public void bookTicket() {
        System.out.println("真实角色订票");
    }

    @Override
    public void sing() {
        System.out.println("真实角色唱歌");
    }

    @Override
    public void collectMoney() {
        System.out.println("真实角色收尾款");
    }
}
public class StarHandler implements InvocationHandler {

    Star realStar;

    public StarHandler(Star realStar) {
        this.realStar = realStar;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        method.invoke(realStar,args);
        return null;
    }
}
    @Test
    public void testProxy(){
        Star realStar = new RealStar();

        Star proxy = (Star) Proxy.newProxyInstance(realStar.getClass().getClassLoader(),
                realStar.getClass().getInterfaces(), new StarHandler(realStar));

        proxy.sing();
    }

运行效果图


image.png
上一篇下一篇

猜你喜欢

热点阅读