设计模式(八)Proxy Parttern 代理模式

核心作用:

通过代理,控制对对象的访问

可以详细控制某个对象的方法,在调用这个方法做前置处理,调用这个方法后做后置处理(AOP的微观实现)

AOP(Aspect Oriented Programming)

面向切面编程的核心实现机制

核心角色:

抽象角色:定义代理角色和真实角色的公共对外方法

真实角色:实现抽象角色,定义真实角色索要实现的业务逻辑,供代理角色调用(关注真正的业务逻辑)

代理角色:实现抽象角色,是真实的角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作(将统一的流程控制放到代理角色中进行处理)

应用场景:

安全代理:屏蔽对真实角色的直接访问

远程代理:通过代理类处理远程方法调用(RMI)

延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象

分类:

静态代理:静态定义代理类

动态代理:动态生成代理类

jdk自带的动态代理

javaassist字节码操作库实现

CGLIB

ASM(底层使用指令)

举例:

歌手唱歌

package com.littlepage.ProxyParttern;

public interface Star {
    //面谈
    void confer();
    //签合同
    void signContract();
    //订票
    void bookTicket();
    //唱歌
    void sing();
    //收钱
    void collectMoney();
}

 

package com.littlepage.ProxyParttern;

public class ProxyStar implements Star{
    private Star star;
    
    public ProxyStar(Star star) {
        super();
        this.star = star;
    }

    @Override
    public void confer() {
        System.out.println("Proxy Star Confer");
    }

    @Override
    public void signContract() {
        System.out.println("Proxy Star SignContract");
    }

    @Override
    public void bookTicket() {
        System.out.println("Proxy Star BookTicket");
    }

    @Override
    public void sing() {
        star.sing();
    }

    @Override
    public void collectMoney() {
        System.out.println("Proxy Star CollectMoney");
    }
}

 

package com.littlepage.ProxyParttern;

public class RealStar implements Star{

    @Override
    public void confer() {
        System.out.println("Real Star Confer");
    }

    @Override
    public void signContract() {
        System.out.println("Real Star SignContract");
    }

    @Override
    public void bookTicket() {
        System.out.println("Real Star BookTicket");
    }

    @Override
    public void sing() {
        System.out.println("Real Star Sing");
    }

    @Override
    public void collectMoney() {
        System.out.println("Real Star CollectMoney");
    }
    
}

 

package com.littlepage.ProxyParttern;

public class Client {
    public static void main(String[] args) {
        RealStar rs=new RealStar();
        ProxyStar ps=new ProxyStar(rs);
        
        ps.confer();
        ps.signContract();
        ps.bookTicket();
        ps.sing();
    }
}

 

UML图:

 

posted @ 2018-12-18 15:01  SteveYu  阅读(205)  评论(0编辑  收藏  举报