作者:刘信坚
链接:http://www.imooc.com/article/details/id/47695
来源:慕课网

首先看看什么是代理模式。

一 代理模式

使用一个代理对象将对象包装起来,然后用该代理对象来取代该对象,任何对原始对象的调用都要通过代理,代理对象决定是否以及何时调用原始对象的方法

二 静态模式

要求被代理类和代理类同时实现相应的一套接口,通过代理类调用重写接口的方法,实际上调用的是原始对象的同样的方法。如下图:

Cilent调用Source的method()方法,实际上是Proxy来调用method()方法,静态代理中Source跟Proxy都要实现接口Sourceable。

三 运行环境

首先是父接口 Animal.java

package com.lxj.proxy;

public interface Animal {

	public void action();
public void breath(); }

Cat.java

package com.lxj.proxy;

//被代理类Cat
public class Cat implements Animal{ @Override
public void action() {
System.out.println("喵喵喵~~~~");
} @Override
public void breath() {
System.out.println("猫式呼吸法~~~~");
}
}

CatProxy.java

package com.lxj.proxy;

//代理类
public class CatProxy implements Animal{ //真正要代理的类
Cat cat; public CatProxy(Cat cat){
this.cat = cat;
} @Override
public void action() {
System.out.println("==========DogProxy 代理类执行开始!=============");
//实质上在代理类中是调用了被代理实现接口的方法
cat.action();
System.out.println("==========DogProxy 代理类执行结束!===========");
} @Override
public void breath() {
System.out.println("==========DogProxy 代理类执行开始!=============");
cat.breath();
System.out.println("==========DogProxy 代理类执行结束!===========");
} }

TestStaticProxy.java

package com.lxj.proxy;

public class TestStaticProxy {

    public static void main(String[] args) {
 //被代理的类Cat,Cat实现了Animal接口
         Cat cat = new Cat();
         //代理类CatProxy,也实现了Animal接口
 CatProxy catProxy = new CatProxy(cat);
         //代理类来调用方法,实际上调用的是Cat的action(),breath()方法
 catProxy.action();
 catProxy.breath();
}
}

运行结果如下:

从运行结果可以看到其实执行的是被代理类的对象.

从这里我们会想,如果我想再创建一个Dog对象,又需要重新为Dog创建一个代理对象,如下:

Dog.java

package com.lxj.proxy;

//被代理类 Dog
public class Dog implements Animal { @Override
public void action() {
        System.out.println("汪汪汪~~~~~");
} @Override
public void breath() {
        System.out.println("狗式呼吸法~~~~");
} }

DogProxy.java

package com.lxj.proxy;

//Dog的代理类
public class DogProxy implements Animal {
   
Dog dog; public DogProxy(Dog dog) {
this.dog = dog;
} @Override
public void action() {
System.out.println("==========DogProxy 代理类执行开始!=============");
dog.action();
System.out.println("==========DogProxy 代理类执行结束!===========");
} @Override
public void breath() {
System.out.println("==========DogProxy 代理类执行开始!=============");
dog.breath();
System.out.println("==========DogProxy 代理类执行结束!===========");
} }

TestStaticProxy.java

package com.lxj.proxy;

public class TestStaticProxy {

    public static void main(String[] args) {
 Cat cat = new Cat();
 CatProxy catProxy = new CatProxy(cat);
 catProxy.action();
 catProxy.breath();
 
 Dog dog = new Dog();
 DogProxy dogProxy = new DogProxy(dog);
 dogProxy.action();
 dogProxy.breath();
}
}

运行结果如下:

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

  1. JAVA设计模式:静态代理

    一.概念代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...

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

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

  3. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

  4. 黑马程序员:Java基础总结----静态代理模式&动态代理

    黑马程序员:Java基础总结 静态代理模式&动态代理   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public  class  Ts {   ...

  5. Java设计模式之《代理模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...

  6. Java中的静态代理实现方式

    1.编写一个接口类 如:Subject package com.neusoft.pattern.staticProxy; /** * <p>Title:</p> * <p ...

  7. java中的静态代理和动态代理,入门整理

    静态代理和动态代理主要解决的问题是:在直接访问对象时带来的问题,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后 ...

  8. 017 Java中的静态代理、JDK动态代理、cglib动态代理

    一.静态代理 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由业务实现类.业务代理类两部分组成.业务实现类负责实现主要的业务方法,业 ...

  9. java设计模式-----11、代理模式

    Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问. 所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代 ...

随机推荐

  1. SQL Server 2016新特性:列存储索引新特性

    SQL Server 2016新特性:列存储索引新特性 行存储表可以有一个可更新的列存储索引,之前非聚集的列存储索引是只读的. 非聚集的列存储索引支持筛选条件. 在内存优化表中可以有一个列存储索引,可 ...

  2. Zookeeper客户端介绍

    客户端是开发人员使用Zookeeper的主要的途径,以下内容将对Zookeeper的内部原理进行详细的学习和讲解.ZooKeeper的客户端主要有一下几个核心组件组成: Zookeeper:提供客户端 ...

  3. 程序员自己编写的类和JDK类是一种合作关系。

    封装类: JAVA为每一个简单数据类型提供了一个封装类,使每个简单数据类型可以被Object来装载. 除了int和char,其余类型首字母大写即成封装类. 转换字符的方式: int I=10; Str ...

  4. SpringMVC+ Mybatis 配置多数据源 + 自动数据源切换 + 实现数据库读写分离

    现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库.Master库负责数据更新和实时数据查询,Slave库当然负责非实时数据查询.因为在实际的应 ...

  5. Flume的监控参数

    参考 flume的http监控参数说明 普通的flume启动命令 bin/flume-ng agent -c conf -f conf/flume-conf.properties -n agent - ...

  6. 乾坤合一~Linux设备驱动之USB主机和设备驱动

    如果不能陪你到最后 是否后悔当初我们牵手 如果当初没能遇见你 现在的我 在哪里逗留 所有的爱都是冒险 那就心甘情愿 等待我们一生中 所有悬念 我一往情深的恋人 她是我的爱人 她给我的爱就像是 带着露水 ...

  7. C_C++变量命名规则

    变量命名规则是为了增强代码的可读性和容易维护性.以下为C++必须遵守的变量命名规则: 变量名只能是字母(A-Z,a-z)和数字(0-9)或者下划线(_)组成. 第一个字母必须是字母或者下划线开头. 不 ...

  8. google的Python风格规范

    Python风格规范   分号 Tip 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 行长度 Tip 每行不超过80个字符 例外: 长的导入模块语句 注释里的URL 不要使用反斜杠连接行. ...

  9. 自定义Flume Sink:ElasticSearch Sink

    Flume Sink的目的是从Flume Channel中获取数据然后输出到存储或者其他Flume Source中.Flume Agent启动的时候,它会为每一个Sink都启动一个SinkRunner ...

  10. hibernate02环境的搭建

    hibernate: 持久层的框架!是一个开放源代码的对象关系映射框架(ORM)!之前我们访问数据库使用JDBC!对JDBC进行了轻量级的对象封装!是一个全自动ORM框架!(底层可以自动生成sql语句 ...