代理模式_静态代理

一、代理模式_静态代理

  来到北京、首先第一件事就是租房子、然而北京租房子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 类多了,每个业务类都要对应一个静态代理类,使得工作量变大了,开发效率降低、由此引出了动态代理来解决这一不足。

原文地址:https://www.cnblogs.com/aeon/p/10280119.html

时间: 2024-07-29 13:12:02

代理模式_静态代理的相关文章

GOF23代理模式之静态代理模式理解之经典

 设计模式之代理模式之静态代理模式      代理模式(Proxy pattern)          核心作用:               通过代理,控制对对象的访问.                    可以通过详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理.(即AOP的微观实现)               AOP(面向切面编程.Aspect Oriented Programming)的核心实现的机制          举个例子来理解这种模

代理模式(静态代理+动态代理)——JAVA

代理模式是常用的java设计模式,他的特征是代理类与目标类有同样的接口,代理类主要负责为目标类预处理消息.过滤消息.把消息转发给目标类,以及事后处理消息等.代理类与目标类之间通常会存在关联关系,一个代理类的对象与一个目标类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用目标类的对象的相关方法,来提供特定的服务. 结构图如下: 按照代理的创建时期,代理类可以分为静态代理和动态代理. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类(Proxy)的.clas

【设计模式】代理模式:静态代理,动态代理,spring aop

代理模式分为静态代理和动态代理.我们拿链家来举例子,我们本人是真实的对象,有真实的业务需求:需要去找房子:链家是中介,是代理类,他来帮我执行找房子的这个操作. 静态代理: 1.实现一个接口 public interface SearchHome { public void search(); } 2.构建实现接口的委托类 public class Master implements SearchHome { @Override public void search() { System.out.

Java设计模式-代理模式之静态代理

Java设计模式-代理模式之静态代理 概念 为另一个对象提供一个替身或占位符以提供对这个对象的访问,使用代理模式创建代表对象,让代表对象控制某对象的访问,被代理对象可以是远程的对象.创建开销大的对象或需要安全控制的对象 远程代理控制访问远程对象 虚拟代理控制访问创建开销大的资源 保护代理基于权限控制对资源的访问 看如下的类图: 仔细看上面的类图,首先是Subject它为RealSubject和Proxy提供了接口,通过实现同一个接口,Proxy在RealSubject出现的地方取代它,这点和适配

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

共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                                      用户库jar包,需要手动发布到tomcat. (每次新建项目) 3) 重新发布项目 * 配置文件错误 (web.xml / struts.xml /bean.xml /hibernate.xml / *.hbm.xml) 明确的提示 * 端口占用 * we

java 代理模式(静态代理、动态代理、Cglib代理) 转载

Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法 代理模式最大的特点就是代理类和实际业务类实现同一个接口(或继承同一父类),代理对象持有一个实际对象的引用,外部调用时操作的是代理对象,而在代理对象的内部实现中又会去调

java代理模式之静态代理

作为一个初级开发者,可能不会接触到代理模式,但是在很多框架的使用中都不知不觉使用了代理模式,比如servlet的过滤器链,spring的AOP,以及spring mvc的拦截器等.所以了解代理模式对于个人的成长是不可避免的. 在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为"代理"的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务. 原文和作者一起讨论:http:

代理模式(静态代理和动态代理)

一.代理模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 静态代理的一个代理只能代理一种类型,而且是在编译器就已经确定被代理的对象.而动态代理是在运行时,通过反射机制实现动态代理,并且能够代理各种类型的对象. 二.静态代理 由程序员创建或工具生成代理类的源码,再编译代理类.所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了. 静

设计模式 代理模式之静态代理

静态代理要搞清楚三个关系:客户类   代理类   委托类  代理类的行为要类似且强于委托类(实现方法有1.继承,2.代理类与委托类实现共同的接口(首选)) /** * 用静态代理模式完成日志的操作 * @author Administrator * */public class UserAction { private UserDao userDao = UserDaoFac.newUserDao(); public void add(){ System.out.println("=======