【设计模式学习笔记】 之 静态代理

简介:静态代理设计模式可以理解为实际操作对象的代理,这个代理拥有实际对象的所有接口,代理对象中持有着实际对象的引用,但是这个代理对象在客户端调用接口的时候,将这些请求进行拦截,对请求数据进行预处理(相当于Filter),可以在预处理中做判断如果满足条件放行实际对象操作,否则代理对象处理并返回。

有几点需要注意:

  • 访问代理对象的客户端并不知道这是一个代理对象,他只关心效果
  • 代理对象可以对调用传参进行处理
  • 特定的情况下代理对象可以代实际对象执行操作

初学亿图画个图,看样子还行,大家凑合看看:)

由于柳大写的代码最开始的实在是太复杂了,后来写的感觉有点怎么说呢……所以自己写了个简单的代理,大家可以对照柳大设计模式第31个静态代理视频进行对照

返回值就不写了,都是使用代理对象的方法返回的,这个毋庸置疑

举例:

周杰伦有个经纪人,找杰伦签约必须找他的经纪人,如果经纪人说档期排满了就不能签约,没排满就让周杰伦去签字。想让杰伦唱歌,只需要让调经纪人的唱歌方法,不管这个经纪人实际会不会唱歌,这个方法是让周杰伦去唱歌。好了看代码吧,写的很简单

首先我们先创建一个歌手的接口,并让经纪人和杰伦都实现这个接口

 1 package com.mi.staticproxy;
 2
 3 /**
 4  * 歌手需要实现的接口
 5  */
 6 public interface Singer {
 7
 8     //签约
 9     public void signContract(int time); //参数为日期,这里为了简单 年+月+日 例:20180303
10     //唱歌
11     public void sing(String song); //参数为歌名
12     //上台发言
13     public void helloSay();
14     //下台发言
15     public void byeSay();
16 }

被代理对象:歌手杰伦

 1 package com.mi.staticproxy;
 2
 3
 4 /**
 5  * 歌手(被代理者):周杰伦
 6  */
 7 public class Jay implements Singer{
 8
 9     private String name = "Jay";
10     public void signContract(int time) {
11         System.out.println(name+"签约中……");
12         System.out.println("--------签约成功-------");
13     }
14
15     public void sing(String song) {
16         System.out.println("下面我给大家唱一首"+song+"---------");
17         System.out.println(name+"正在唱"+song);
18         System.out.println(song+"唱完了,谢谢大家~");
19     }
20
21     public void helloSay() {
22         System.out.println("大家好,我是"+name+",哎哟,不错啊~");
23     }
24
25     public void byeSay() {
26         System.out.println("谢谢大家听我唱歌!再见~");
27     }
28
29
30 }

代理:经纪人

 1 package com.mi.staticproxy;
 2
 3
 4 /**
 5  * 代理对象:经纪人
 6  */
 7 public class Agent implements Singer{
 8
 9     private Jay jay; //持有被代理对象引用
10
11     public void signContract(int time){
12         System.out.println("当前签约时间:"+time);
13         /*
14          * 代理对象自己处理
15          */
16         if(time<20180606){ //这里就模拟档期已经排到了2018年6月6日
17             System.out.println("杰伦档期排满了,2018年6月6日之后的吧!");
18             System.out.println("---------签约失败---------");
19             return;
20         }
21         jay.signContract(time);
22     }
23
24     public void sing(String song) {
25         //预处理:加书名号
26         song = "《"+song+"》";
27         jay.sing(song);
28     }
29
30     public void helloSay() {
31         jay.helloSay();
32     }
33
34     public void byeSay() {
35         jay.byeSay();
36     }
37
38     //setter
39     public void setJay(Jay jay) {
40         this.jay = jay;
41     }
42 }

测试类:

 1 package com.mi.staticproxy;
 2
 3 public class Test {
 4
 5     public static void main(String[] args) {
 6
 7         Agent agent = new Agent();
 8         agent.setJay(new Jay());
 9         agent.signContract(20180303);
10         agent.signContract(20180607);
11         agent.helloSay();
12         agent.sing("发如雪");
13         agent.sing("稻香");
14         agent.sing("十里香");
15         agent.byeSay();
16
17     }
18
19 }

输出:

当前签约时间:20180303
杰伦档期排满了,2018年6月6日之后的吧!
---------签约失败---------
当前签约时间:20180607
Jay签约中……
--------签约成功-------
大家好,我是Jay,哎哟,不错啊~
下面我给大家唱一首《发如雪》---------
Jay正在唱《发如雪》
《发如雪》唱完了,谢谢大家~
下面我给大家唱一首《稻香》---------
Jay正在唱《稻香》
《稻香》唱完了,谢谢大家~
下面我给大家唱一首《十里香》---------
Jay正在唱《十里香》
《十里香》唱完了,谢谢大家~
谢谢大家听我唱歌!再见~

简单总结:

代理模式都是为需要代理的对象提供预处理操作,或者一些比较大的对象不想在启动的时候就加载进内存,可以通过代理进行判断是否创建这个对象,调用前创建对象,减轻系统开支。

学习静态代理的目的是为了更好的理解动态代理,Java的动态代理太强了以至于埋没了静态代理

相较于动态代理分别使用的场景:

  • 如果在场景不是很复杂,代理对象确定的情况下,使用静态代理代码更具可读性;
  • 场景复杂且被代理对象不确定的情况使用动态代理。

静态代理是在编译期间就已经定义好被代理对象的类,而动态代理用到了字节码技术,在运行期间生成被代理对象

先写这么多,欢迎评论,如有错误,望不吝赐教!

原文地址:https://www.cnblogs.com/hellxz/p/8496203.html

时间: 2024-11-16 17:36:37

【设计模式学习笔记】 之 静态代理的相关文章

java/android 设计模式学习笔记(9)---代理模式

这篇博客我们来介绍一下代理模式(Proxy Pattern),代理模式也成为委托模式,是一个非常重要的设计模式,不少设计模式也都会有代理模式的影子.代理在我们日常生活中也很常见,比如上网时连接的代理服务器地址,更比如我们平时租房子,将找房子的过程代理给中介等等,都是代理模式在日常生活中的使用例子. 代理模式中的代理对象能够连接任何事物:一个网络连接,一个占用很多内存的大对象,一个文件,或者是一些复制起来代价很高甚至根本不可能复制的一些资源.总之,代理是一个由客户端调用去访问幕后真正服务的包装对象

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

大话设计模式学习笔记——面向对象基础

前言 好记性不如烂"笔头"系列--大话设计模式学习笔记 目录 面向对象基础 面向对象基础 什么是类与实例 一切事物皆为对象,即所有的东西老师对象,对象就是可以看到.感觉到.听到.触摸到.尝到.或闻到的东西.准确地说,对象是一个自包含的实体,用一组可识别的特性和行为来标识.面向对象编程,英文叫 Object-Oriented Programming,其实就是针对对象来进行编程的意思.类就是具有相同属性和功能的对象的抽象集合.实例就是一个真实的对象.比如我们属于'人'类,而个人就是'人'类

设计模式学习笔记(目录篇)

设计模式学习笔记(目录篇) 为了方便查看,特此将设计模式学习笔记系列单独做一个目录. 1   设计模式学习笔记(一:命令模式) 2   设计模式学习笔记(二:观察者模式) 3   设计模式学习笔记(三:装饰模式) 4   设计模式学习笔记(四:策略模式) 5   设计模式学习笔记(五:适配器模式) 6   设计模式学习笔记(六:责任链模式) 7   设计模式学习笔记(七:外观模式) 8   设计模式学习笔记(八:迭代器模式) 9   设计模式学习笔记(九:中介者模式) 10  设计模式学习笔记(

java/android 设计模式学习笔记(3)---工厂方法模式

这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或取得对象的初始设置:选择生成哪个子对象实例:或在生成你需要的对象之前必须先生成一些辅助功能的对象,这个时候就需要了解该对象创建的细节,也就是说使用的地方与该对象的实现耦合在了一起,不利于扩展,为了解决这个问题就需要用到我们的工厂方法模式,它适合那些创建复杂的对象的场景,工厂方法模式也是一个使用频率很

java/android 设计模式学习笔记(5)---对象池模式

这次要介绍一下对象池模式(Object Pool Pattern),这个模式为常见 23 种设计模式之外的设计模式,介绍的初衷主要是在平时的 android 开发中经常会看到,比如 ThreadPool 和 MessagePool 等. 在 java 中,所有对象的内存由虚拟机管理,所以在某些情况下,需要频繁创建一些生命周期很短使用完之后就可以立即销毁,但是数量很大的对象集合,那么此时 GC 的次数必然会增加,这时候为了减小系统 GC 的压力,对象池模式就很适用了.对象池模式也是创建型模式之一,