代理模式_静态代理

Posted aeon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式_静态代理相关的知识,希望对你有一定的参考价值。

一、代理模式_静态代理

  来到北京、首先第一件事就是租房子、然而北京租房子80%的都要通过中介,中介获得房屋出租的权限,出租房屋给房客。我们以这个很现实很亲近我们生活的例子来认识代理模式中的静态代理。

二、代理模式中的角色划分

  2.1抽象角色:把真实角色和代理角色所共有的行为抽成一个接口或者抽象类。

  2.2真实角色:被代理角色所代理的角色。

  2.3代理角色:代理真实角色做某些工作。

三、静态代理示例

  3.1抽象角色(把真实角色房东和代理角色中介所共有的行为出租房屋抽象成一个接口)  

package edu.aeon.model.staticproxy;

/**
 * [说明]:静态代理_抽象角色
 * 
 * @author aeon(qq:1584875179)
 *
 */
public interface AbstractRole {
    /***
     * 房屋出租
     */
    void rent();
}

  3.2真实角色(房东) 

package edu.aeon.model.staticproxy;

/**
 * [说明]:静态代理_房东(真实角色)
 * 
 * @author aeon(qq:1584875179)
 *
 */
public class HouseOwner implements AbstractRole {

    @Override
    public void rent() {
        System.out.println("HouseOwner.rent()_房屋出租");
    }
}

  3.3代理角色(中介)  

package edu.aeon.model.staticproxy;
/**
 * [说明]:静态代理_中介(代理角色)
 * @author aeon(qq:1584875179)
 *
 */
public class Proxy implements AbstractRole {
    //真实角色
    private AbstractRole abstractRole;
    public Proxy() {
    }
    /**
     * 方式一、构造器方式获得房东(真实角色)的授权
     * @param abstractRole 抽象角色接口(面向接口编程)
     */
    public Proxy(AbstractRole abstractRole) {
        this.abstractRole = abstractRole;
    }
    /**
     * 方式二、setter方式获得房东(真实角色)的授权
     * @param abstractRole 抽象角色接口(面向接口编程)
     */
    public void setHouseOwner(AbstractRole abstractRole) {
        this.abstractRole = abstractRole;
    }

    /**
     * 获得房东授权且代理房东出租房屋
     */
    @Override
    public void rent() {
        before();
        this.abstractRole.rent();
        after();
    }
    /**
     * 被代理前做某些工作
     */
    public void before(){
        System.out.println("Proxy.before()_被代理前做某些工作...");
    }
    /**
     * 被代理后做某些工作
     */
    public void after(){
        System.out.println("Proxy.after()_被代理后做某些工作...");
    }

}

  3.4测试类  

package edu.aeon.model.staticproxy;
/**
 * [说明]:静态代理_测试类
 * @author aeon(qq:1584875179)
 *
 */
public class Test {

    public static void main(String[] args) {
        //真实角色
        AbstractRole houseOwner=new HouseOwner();
        //方式一:通过构造器方式获得房东授权的代理角色
        AbstractRole proxy1=new Proxy(houseOwner);
        //方式二:通过setter方式获得房东授权的代理角色
        Proxy proxy2=new Proxy();
        proxy2.setHouseOwner(houseOwner);
        //代理房东出租房屋
        proxy1.rent();
        System.out.println("========================");
        proxy2.rent();
    }

}

  测试结果截图如下:

  技术分享图片

四、静态代理的优缺点

  4.1优点

    4.1.1 使得真实角色处理的业务更加的纯粹、不再去关注一些公共的事情(如日志、安全...)

    4.1.2 公共的业务由代理来完成,实现了业务的分工,使得开发者更加集中的做自己某一领域的工作(如:写业务类的只关注业务类,写日志的只关注日志)

    4.1.3 公共业务发生扩展时变得更加集中和方便(应为公共的业务都集中到代理类去实现)

  4.2缺点

    4.2.1 类多了,每个业务类都要对应一个静态代理类,使得工作量变大了,开发效率降低、由此引出了动态代理来解决这一不足。

以上是关于代理模式_静态代理的主要内容,如果未能解决你的问题,请参考以下文章

通俗易懂式分析静态代理模式_ _扎根spring AOP必须要掌握的代理模式之静态代理

Spring框架_代理模式(静态代理,动态代理,cglib代理)

设计模式_代理模式

JDK_Proxy_InvocationHandler_动态代理

代理模式(静态代理)

代理模式之静态代理实现代码