静态代理设计模式(StaticProxy)

  静态代理设计模式:

      要求:真实角色,代理角色;真实角色和代理角色要实现同一个接口,代理角色要持有真实角色的引用。

  在Java中线程的设计就使用了静态代理设计模式,其中自定义线程类实现Runable接口,Thread类也实现了Runalbe接口,在创建子线程的时候,传入了自定义线程类的引用,再通过调用start()方法,调用自定义线程对象的run()方法。实现了线程的并发执行。

 1 public class Test2 {
 2
 3     public static void main(String[] args) {
 4         //Runnable实现类对象,真实角色
 5         Thread1 role1 = new Thread1();
 6         //线程类代理角色,该类也实现了Runnable接口,代理角色
 7         Thread thread1 = new Thread(role1);//传入了真实角色的引用
 8
 9         thread1.start();
10
11     }
12 }
13
14 class Thread1 implements Runnable {
15
16     @Override
17     public void run() {
18         //TODO
19     }
20
21 }

  Thread对象调用线程的start()方法,在内部调用了真实角色的run()方法。

设计静态代理模式

  第一步,要有一个共同使用的接口

1 // 共同的接口
2 public interface Proxy {
3     public abstract void todo();
4 }

  代理角色和真实角色共同实现该接口,代理角色实现需要的功能。

 1 // 真实角色
 2 class RealityRole implements Proxy {
 3
 4     @Override
 5     public void todo() {
 6         System.out.println("真实角色的功能");
 7     }
 8 }
 9
10 // 代理角色
11 class ProxyRole implements Proxy {
12     // 持有代理角色的引用
13     private Proxy realityRole;
14
15     public ProxyRole() {
16
17     }
18
19     //传入一个真实角色
20     public ProxyRole(Proxy role) {
21         realityRole = role;
22     }
23     @Override
24     public void todo() {
25         //在真实角色功能运行之前,代理角色做准备工作
26         doBefore();
27         //执行真实角色的功能
28         realityRole.todo();
29         //代理角色的收尾工作
30         doAfter();
31     }
32     private void doBefore() {
33         System.out.println("准备工作");
34     }
35     private void doAfter() {
36         System.out.println("收尾工作");
37     }
38 }

  创建真实角色的对象和代理角色的对象,并将真实角色对象的引用传给代理角色,让代理角色去执行功能。

 1 public class Test {
 2     public static void main(String[] args) {
 3         //创建真实角色对象
 4         Proxy realityRole = new RealityRole();
 5         //创建代理角色对象,并制定真实对象
 6         ProxyRole proxyRole = new ProxyRole(realityRole);
 7         //代理角色工作,本质调用的还是真实角色的功能
 8         proxyRole.todo();
 9     }
10 }运行结果:  准备工作  真实角色的功能  收尾工作

  

时间: 2024-10-10 08:19:12

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

28 多线程(二)——静态代理设计模式

引入 在前一节我们学习了实现Runnable接口创建线程,其中提到只使用一次对象时使用匿名对象,如: new Thread(new xxx().start();//xxx为实现了Runnable的类 Thread就是一个静态代理,使用了这种方法,xxx类无需继承Thread类,就可以通过Thread类创建一个线程. Thread就和装饰类的作用相似,都是包装一个对象. 那么,静态代理设计模式的特点就是: 代理者与被代理者都继承同一个接口(Thread与xxx继承的是Runnable接口) 代理者

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

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

静态代理设计模式

代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象. 为什么需要代理: 打一个最简单的比方,我现在想要学习,那么就必须得把书包拿过来,把书掏出来,准备好纸笔,然后开始学习,等学完了我还得收拾书,把书塞回书包里,还得整理一下书包,这是一个完整的学习的过程,但是我很懒,不想动弹,只想学习,那可能就得让妈妈帮我把书包拿过来,把书打开,我只管学习就好了,学完以后,妈妈再帮我把书整理好放回去.(我这是打个什么破比方...),在这里,妈妈就代表了一个代理对象,要学习的人是我,

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

简介:静态代理设计模式可以理解为实际操作对象的代理,这个代理拥有实际对象的所有接口,代理对象中持有着实际对象的引用,但是这个代理对象在客户端调用接口的时候,将这些请求进行拦截,对请求数据进行预处理(相当于Filter),可以在预处理中做判断如果满足条件放行实际对象操作,否则代理对象处理并返回. 有几点需要注意: 访问代理对象的客户端并不知道这是一个代理对象,他只关心效果 代理对象可以对调用传参进行处理 特定的情况下代理对象可以代实际对象执行操作 初学亿图画个图,看样子还行,大家凑合看看:) 由于

设计模式之静态代理模式

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

java之 代理设计模式

1. 设计一个案例来实现租房功能.分析:在租房的过程中涉及到了3个对象,房东,中介,房客. 中介和房客具有相同的功能--租房. 可以设计如下: 2.上图的设计实际上就是一个代理设计模式---静态代理设计模式. 代理设计模式有4个角色 抽象角色 : 是一个接口,使得真实角色和代理角色具有相同的功能. 真实角色: 实际存在某个功能或权限的角色. 代理角色:代理真实角色实现某种功能.代理角色可以附加另外一些功能. 客户端:使用代理角色. 3.使用代码实现 Rent.java public interf

设计模式(一) 静态代理

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

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

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

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

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