设计模式之静态代理

一 什么是代理

代理(Proxy) 它是一种设计模式,提供了对目标对象另外的访问,即通过代理对象访问目标对象。这样做的好处就是可以在不改变目标对象实现前题下,增加额外的功能,即对目标对象的功能做扩展。

举个例子:我们需要在一个方法的执行前和执行后添加日志记录功能,在不使用代理时,我们的方法调用如下

此时,我们就需要修改当前的实现方法,不符合我们添加业务方法时不破换原有方法(目标对象)的设计思想。使用代理后,我们的方法调用如下

这个时候,我们调用的时代理对象,这时我们就只需要在在代理类中添加我们的逻辑而不需要去修改目标对象。

二 静态代理的实现

定义一个接口

1 public interface ICatDao {
2
3     /**
4      * 保存
5      */
6     void save();
7
8 }

接口的实现类(目标对象)

1 public class CatDaoImpl implements ICatDao {
2
3     @Override
4     public void save() {
5         System.out.println("保存信息");
6     }
7 }

不使用代理,我们测试执行方法

1 public static void main(String[] args) {
2         //目标类
3         ICatDao userDao = new CatDaoImpl();
4
5         userDao.save();
6
7     }

如果要添加日志,我们就需要修改save方法,在里边添加相应的操作记录。

下来我们使用静态代理,创建一个静态代理对象

 1 public class CatDaoProxy implements ICatDao {
 2
 3     /**
 4      * 目标对象
 5      */
 6     private ICatDao target;
 7
 8     /**
 9      * 构造方法
10      */
11     public CatDaoProxy(ICatDao userDao) {
12         this.target = userDao;
13     }
14
15     @Override
16     public void save() {
17         before();
18         target.save();
19         after();
20     }
21
22     public void before(){
23         System.out.println("方法调用前");
24     }
25
26     public void after(){
27         System.out.println("方法调用后");
28     }
29
30 }

测试,修改之前的测试方法

1 public static void main(String[] args) {
2         //目标类
3         ICatDao userDao = new CatDaoImpl();
4         //通过目标类,生成代理类
5         CatDaoProxy proxy = new CatDaoProxy(userDao);
6         //调用代理类实现的方法
7         proxy.save();
8     }

执行结果

可以看到,我们没有修改save方法,也实现了在方法执行前和执行后添加日志记录。

原文地址:https://www.cnblogs.com/love-wzy/p/10163734.html

时间: 2024-08-30 01:49:07

设计模式之静态代理的相关文章

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

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

设计模式之静态代理模式

举个栗子: 比如你结婚,婚庆公司帮你代理一些事情(布置婚房,准备午餐等),虽然婚前公司做的,但是是为你而做的 静态代理的设计模式的三要素: 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