设计模式(一) 静态代理

1.1、简单理解代理模式

        代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式;即通过代理访问目标对象。 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作,扩展目标对象的功能。列如:我们有的时候打官司,我们需要请律师,因为律师在法律方面有专长,可以替我们进行打赢官司的操作,表达我们的想法。在这个列子中,我们就是目标对象,而律师就是代理对象,帮助我们完成我们所想的事情。当然打赢官司与打不赢这就是另外一回事了。

        代理模式的关键点: 代理对象 与 目标对象。

1.2、静态代理

 代理模式可以有多种实现,其中静态代理就是其中之一。

        静态代理实现的要求:(一)代理对象,要实现与目标对象一样的接口。

        比如说我们现在有一个需求,在程序类的实现方法中添加日志的监控处理,方便维护调试,所以我们要做的就是在程序的所有方法里加入日志监控的代码。但是有个问题就是已经写好的代码不宜修改,而且一个项目中不单单是只有一个类的问题,要在所有的方法中加入日志监控的代码,工作量将会比较大。如果第二天需求又变了要求将所有的日志清除,可想而知多么操蛋。那么我们应该怎么做的。我们可以通过静态代理来实现。代码如下:

 新建一个接口:IUserDao     

public interface IUserDao {
    public void save();//保存用户
}

 目标对象:UserDao     

public class UserDao implements IUserDao { //目标对象
    @Override
    public void save() {
        System.out.println("保存用户");
    }
}

代理对象:UserDaoProxy

public class UserDaoProxy implements IUserDao {//代理对象

    private IUserDao targer;

    public UserDaoProxy(IUserDao targer) {
        this.targer = targer;
    }

    @Override
    public void save() {
            System.out.println("日志打印---开始---");
            targer.save();
            System.out.println("日志打印---结束---");
    }
}

测试:Main

public class Main {

    public static void main(String[] args) {

        IUserDao userDao = new UserDao();

        IUserDao userDaoProxy = new UserDaoProxy(userDao);

        userDaoProxy.save();

    }
}

输出结果:

总结静态代理:

    1)可以做到在不修改目标对象的功能前提下,对目标对象功能扩展,增加额外的功能。

    2)缺点:

        --》  因为代理对象,需要与目标对象实现一样的接口,所以会有很多代理类,类太多。

        --》  一旦接口增加方法,目标对象与代理对象都要维护,工作量太大。

解决办法:

      代理工厂 或者 可以使用动态代理。(详情请看相关资料)

    

时间: 2024-10-13 19:33:25

设计模式(一) 静态代理的相关文章

用过滤器和装饰者设计模式(静态代理)解决getParameter乱码问题

post的乱码问题比较好解决,这里主要是对get请求的乱码做处理 解决思路:增强request对象的getParameter方法,使之 getParameter  直接获取到的就是解决乱码后的数据 有四种方式, 1.继承 :(下下策) ①明确知道全类名 可以打印request实现类,可以知道实现类的全类名 ②就是可以在子类中 new 父类 你能确定request实现类,一定可以new么? 确定自己写出的是通用方法.tomcat,weblogic,jboss...... 缺点: ①很难实现,几乎没

设计模式之静态代理

一 什么是代理 代理(Proxy) 它是一种设计模式,提供了对目标对象另外的访问,即通过代理对象访问目标对象.这样做的好处就是可以在不改变目标对象实现前题下,增加额外的功能,即对目标对象的功能做扩展. 举个例子:我们需要在一个方法的执行前和执行后添加日志记录功能,在不使用代理时,我们的方法调用如下 此时,我们就需要修改当前的实现方法,不符合我们添加业务方法时不破换原有方法(目标对象)的设计思想.使用代理后,我们的方法调用如下 这个时候,我们调用的时代理对象,这时我们就只需要在在代理类中添加我们的

设计模式之静态代理模式

举个栗子: 比如你结婚,婚庆公司帮你代理一些事情(布置婚房,准备午餐等),虽然婚前公司做的,但是是为你而做的 静态代理的设计模式的三要素: 1.真实角色 2.代理角色:代理角色需要具有真实角色的引用,这样才能实现对真实角色的代理 3.真实角色和代理角色要实现共同的接口 看个样例: Staticproxy.java package 设计模式; /** * @author:yb * @version 创建时间:2018-12-24 下午4:48:03 类说明 */ /* * 静态代理 设计模式 *

设计模式之--静态代理及动态代理模式

原文链接:http://www.studyshare.cn/blog/details/1181/0 一.概念 代理模式:为其他对象提供一种代理类用以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用 另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用,代理模式属于23中设计模式中的结构型设计模式. 代理模式可分为静态代理和动态代理. 代理结构如下图: 例如:客户(客户类)—>代购(代理类)—>海外下单(海外订单类),普通客户无法直接去海外下单,则向代购公司 下单,代

代理设计模式之静态代理与动态代理(超..)详解

在学习Spring框架的时候,有一个重要的思想就是AOP,面向切面编程,利用AOP的思想结合Spring的一些API可以实现核心业务与辅助业务的分离,即可以在执行核心业务时,将一些辅助的业务加进来,而辅助业务(如日志,权限控制等)一般是一些公共业务,这样就实现了两者的分离,使得核心业务的代码更加纯粹,而且辅助业务也能得到复用,这一篇笔记是当时学习spring的时候写的,使用springAPI以及自定义类 实现AOP的一个例子 ,.AOP底层就是通过动态代理来实现的,最近专门学习了一下代理模式,反

GOF23设计模式之静态代理模式实现之经典

 /**  * 抽象就角色,定义代理角色和真实角色的公共对外方法  * 时间:2015年4月4日18:45:00  * 在这个例子中,抽象角色起着规范代理角色和真实角色的作用.  * 其中具有方法,面谈,签合同收预付款,预订机票,唱歌,收尾款  */ package com.bjsxt.cn.proxy.staticProxy; public interface Star {  void confer();  void signContract();  void bookTicket();

装饰者设计模式与静态代理设计模式的对比

相同点: (1) 装饰者类与代理类都需要实现目标类所实现的接口 (2) 装饰者类与代理类中都需要声明目标类对象,目的是这些类中都需要调用目标对象的目标方法 (3) 装饰者类与代理类都可以在不改变目标类的前提下对目标对象进行增强 不同点: (1) 目的不同:装饰者类的目的就是为了增强目标类:静态代理类的目的是为了保护和隐藏目标对象. (2) 装饰者类与代理类中都需要声明目标类对象,但对于目标对象的创建方式不同.装饰者类是由带参构造器传入的:代理类中的目标对象,是在无参构造器中直接创建的. (3) 

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

代理模式(Proxy pattern):当一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用.静态代理是具体去实现需要代理对象接口,覆写方法时进行个性化操作. 单独为代理而实现作为某个接口实现类的则为静态代理(Static Proxy). 不多说了,上代码? package com.ant; public interface Hello { public void say(); } package com.ant; public class HelloIm

设计模式一静态代理模式

静态代理模式 间接地访问该对象,从而限制.增强或修改该对象的一些特性.       代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 静态代理 是由程序员创建或特定工具自动生成源代码,在对其编译. 在程序员运行之前,代理类.class文件就已经被创建了. 动态代理 是在程序运行时通过反射机制动态创建的. 静态代理总结: 优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展. 缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理. 同时接口一旦发生改变,代理类也

设计模式之 静态代理

1 public class Test_5 { 2 public static void main(String[] args) { 3 you u=new you(); 4 // u.happyMarry(); 5 new weddingCompany(u).happyMarry(); 6 } 7 } 8 //真实对象:你 9 class you implements marry{ 10 @Override 11 public void happyMarry() { 12 System.out