文档章节

易学设计模式看书笔记(7) - 代理模式

sitaluoduoxi
 sitaluoduoxi
发布于 2016/07/26 22:15
字数 772
阅读 3
收藏 0


代理模式

1.系统日志记录的例子:给系统中的业务逻辑加上日志
(1):最简单直接的做法

public class Test
{
 private Logger logger = Loger.getLogger(this.getClass().getName());

 public void doLgic(String name){

  logger.log(name + "开始业务逻辑处理...");
 
  //业务逻辑处理相关程序
  System.out.println("业务逻辑处理相关程序");
  
  logger.log(name + "业务逻辑处理结束...");
 }
}
有其他的类的业务逻辑也需要记录日志:
public class Test1
{
 private Logger logger = Loger.getLogger(this.getClass().getName());

 public void doLgic(String name){

  logger.log(name + "开始业务逻辑处理...");
 
  //业务逻辑处理相关程序
  System.out.println("业务逻辑处理相关程序");
  
  logger.log(name + "业务逻辑处理结束...");
 }
}


 

这两个类为了记录日志,在处理业务逻辑的代码中加入了有关日志处理的方法,
这些方法加入的模式很相似,混淆了类的单一职责,有什么办法解决这个问题?

(2):静态代理

定义一个有业务逻辑的接口类:
public interface Test
{
 public void doLogic(String name);
}
具体的逻辑处理类:
public class TestImpl implements Test
{
 public void doLogic(){
  System.out.println("业务逻辑处理");
 }
}

日志代理类:
public class TestProxy implements Test
{
 private Logger logger = Loger.getLogger(this.getClass().getName());
 private Test test;
 public TestProxy(Test test){
  this.test = test;
 }

 public void doLogic(String name){
  logger.log("开始业务逻辑处理...");
  //业务逻辑处理
  test.doLogic(name);
  logger.log("业务逻辑处理结束...");
 }
}

调用代理类,实现日志输出:

public class Client
{
 public static void main(String[] args){
  TestProxy testProxy = new TestProxy(new TestImpl());
  testProxy.doLogic("小四");
 }
}

通过业务逻辑的代理类来调用具体的业务逻辑,同样实现了日志的记录,
而且把日志的记录和业务逻辑进行了分离,这是静态代理。
存在问题就是:每个方法都要有一个代理类,如果系统中的每个类都要日志记录,
那代理类的数量很多。解决办法就是动态代理了。

(3):动态代理

基于JDK的动态代理:

public LogProxy implements InvocationHandler
{
 private Logger logger = Loger.getLogger(this.getClass().getName());
 private Object delegate;//代理对象
 
 public Object bind(Object delegate){
  this.delegate = delegate;
  return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
   delegate.getClass().getInterfaces(),this);
 }

 public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
  
  Object result = null;
  try{
   logger.log("开始业务逻辑处理...");
   //业务逻辑处理
   result = method.invoke(delegate,args);
   logger.log("业务逻辑处理结束...");
  }catch(Exception e){
   logger.log(e.toString());
  }

  return result;
 }
}

public class  Client
{
 public static void main(String[] args) 
 {
  LogProxy logProxy = new LogProxy();
  Test test = (Test)logProxy.bind(new TestImpl());
  test.doLogin("小五");
 }
}

JDK的动态代理只能针对接口代理,要实现对类的动态代理可以用cglib的动态代理或者其它类库的。

一般推荐的是面向接口编程。

2.动态代理模式简介:
【定义】
代理模式就是给一个对象提供一个代理对象,由这个代理对象控制对
原对象的引用,使代理对象在原对象和客户端之间起到一个中介的作用。

【原理】
代理模式主要由三部分组成:
抽象目标类,具体目标类 和代理类。

【使用时机】
当系统需要对某个对象进行额外的控制时。

© 著作权归作者所有

sitaluoduoxi
粉丝 0
博文 33
码字总数 24992
作品 0
广州
后端工程师
私信 提问
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Leetcode PHP题解--D88 696. Count Binary Substrings

D88 696. Count Binary Substrings 题目链接 696. Count Binary Substrings 题目分析 给定一个01字符串,返回仅用连续的0和1串所能组成的二进制字符串个数。 例如,00110011,就包含0011,0...

skys215
6分钟前
0
0
基础工具类

package com.atguigu.util;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;import javax.sql.DataSource;import com.alibaba.druid......

architect刘源源
今天
43
0
P30 Pro劲敌!DxO官宣新机:排行榜又要变

5月26日晚间,DxOMark官方推特预告,将在5月27日公布一款新机型的DxOMark评分,猜猜是哪款? 网友猜想的机型有:红米K20、谷歌Pixel 3a、索尼Xperia 1、诺基亚9 PureView等。 DxOMark即将公布...

linux-tao
昨天
15
0
Ubuntu18.04.2窗口过小不能自适应(二次转载)

解决Ubuntu在虚拟机窗口不能自适应 2018年09月06日 16:20:08 起不了名儿 阅读数 855 此博文转载:https://blog.csdn.net/nuddlle/article/details/77994080(原地址) 试了很多办法这个好用 ...

tahiti_aa
昨天
2
0
死磕 java同步系列之CountDownLatch源码解析

问题 (1)CountDownLatch是什么? (2)CountDownLatch具有哪些特性? (3)CountDownLatch通常运用在什么场景中? (4)CountDownLatch的初始次数是否可以调整? 简介 CountDownLatch,可以...

彤哥读源码
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部