静态代理设计模式:

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

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

 public class Test2 {

     public static void main(String[] args) {
//Runnable实现类对象,真实角色
Thread1 role1 = new Thread1();
//线程类代理角色,该类也实现了Runnable接口,代理角色
Thread thread1 = new Thread(role1);//传入了真实角色的引用 thread1.start(); }
} class Thread1 implements Runnable { @Override
public void run() {
//TODO
} }

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

设计静态代理模式

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

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

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

 // 真实角色
class RealityRole implements Proxy { @Override
public void todo() {
System.out.println("真实角色的功能");
}
} // 代理角色
class ProxyRole implements Proxy {
// 持有代理角色的引用
private Proxy realityRole; public ProxyRole() { } //传入一个真实角色
public ProxyRole(Proxy role) {
realityRole = role;
}
@Override
public void todo() {
//在真实角色功能运行之前,代理角色做准备工作
doBefore();
//执行真实角色的功能
realityRole.todo();
//代理角色的收尾工作
doAfter();
}
private void doBefore() {
System.out.println("准备工作");
}
private void doAfter() {
System.out.println("收尾工作");
}
}

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

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

  

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

  1. 代理设计模式 (静态代理设计模式)+ 动态代理(JDK和Cglib)

    一.代理设计模式 1.设计模式:前人总结一套解决特定问题的代码 2.代理设计模式优点: 2.1 保护真实对象 2.2 让真实对象职责更明确 2.3 扩展 3.代理设计模式 3.1 真实对象(老总) 3 ...

  2. SpringAOP基础 - 静态代理设计模式

    代理模式在实现过程中,要创建一个接口(社交技巧-接口),代理类(经纪人 - 类)和真实类(范冰冰 - 类)同时实现这个接口. 举个例子: 我们想要找范冰冰吃饭,但是呢,她是大明星,不可能轻易见我们,我 ...

  3. Java多线程之静态代理

    package org.study2.javabase.ThreadsDemo.staticproxy; /** * @Date:2018-09-18 静态代理 设计模式 * 1.真实角色 * 2.代 ...

  4. Spring知识点总结(四)之SpringAOP基础 - 代理设计模式

        1. 分析程序中存在的问题(高内聚,低耦合)        通过springIOC DI) 以及注解的使用,成功解决了在程序中层与层之间出现的耦合的问题,但是在很多地方仍然存在非该层应该实现的 ...

  5. Java动态代理和静态代理区别

    静态代理 package staticproxy; /** * 接口 * @author newtouch * */ public interface IHello { public void say ...

  6. java之 代理设计模式

    1. 设计一个案例来实现租房功能.分析:在租房的过程中涉及到了3个对象,房东,中介,房客. 中介和房客具有相同的功能--租房. 可以设计如下: 2.上图的设计实际上就是一个代理设计模式---静态代理设 ...

  7. Spring -07 -AOP [面向切面编程] - 使用注解@+ AspectJ 方式实现环绕/前/后等通知 -超简洁 --静态代理/动态代理{JDK/cglib}

    1.spring 不会自动去寻找注解,必须告诉 spring 哪些包下的类中可能有注解;使用注解来取代配置文件.1.1 引入xmlns:context ,指定扫描范围 <context:comp ...

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

    post的乱码问题比较好解决,这里主要是对get请求的乱码做处理 解决思路:增强request对象的getParameter方法,使之 getParameter  直接获取到的就是解决乱码后的数据 有 ...

  9. JAVA设计模式——代理(静态代理)

    定义 为其它的对象提供一种代理,以控制这个对象的访问 使用场景 当不想直接访问某个对象的时候,就可以通过代理 1.不想买午餐,同事帮忙带 2.买车不用去厂里,去4s店 3.去代理点买火车票,不用去车站 ...

随机推荐

  1. Java子线程中的异常处理(通用)

    在普通的单线程程序中,捕获异常只需要通过try ... catch ... finally ...代码块就可以了.那么,在并发情况下,比如在父线程中启动了子线程,如何正确捕获子线程中的异常,从而进行相 ...

  2. 最长上升子序列 LIS(Longest Increasing Subsequence)

    引出: 问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…< ...

  3. K相邻算法

    刚开始学习机器学习,先跟这<机器学习实战>学一些基本的算法 ----------------------------------分割线--------------------------- ...

  4. ch4-注册 登陆 实现 cookie使用

    1 mysql 回调函数优化 1.1 mysql代码: config.query(handlerStr, value, function (err, data) { callback &&am ...

  5. zoj2277 The Gate to Freedom

                                                            传送门 题目大意,对n,                求n^n的最左边一位数的大小: ...

  6. Java基础入门知识

    Java编程入门知识   知识概要: (1)Java入门基本常识 (2)Java的特性跨平台性 (3)Java的编程环境的搭建 (4)Java的运行机制 (5)第一个Java小程序入门 (1)Java ...

  7. C#微信公众号/订阅号开发 接口源码

    using System; using System.Web; using System.IO; using System.Text; using System.Web.Security; using ...

  8. Linux基础命令讲解(一)

    Linux命令基本格式: 命令 [参数] [路径文件] 方括号内容可省略 查看命令帮助手段: 1 man 命令名(man 还可以获取配置文件,函数的帮助) 2 命令 --help 3 help 命令( ...

  9. Oracle_11gR2_概念_第06章_数据字典和动态性能视图_英文词汇

    decode 解码 be intend for  适应 distinguished 显著的,突出的 implied 隐含的 abbreviated     简短的 enabled roles    已 ...

  10. SELECT与SET对变量赋值

    SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT. 对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们并没有注意,其实这两 ...