Java使用设计模式中的代理模式构建项目的实例展示_java

概念

代理模式(Proxy):代理模式其实就是多一个代理类出来,替原对象进行一些操作。比如咱有的时候打官司需要请律师,因为律师在法律方面有专长,可以替咱进行操作表达咱的想法,这就是代理的意思。代理模式分为两类:1、静态代理(不使用jdk里面的方法);2、动态代理(使用jdk里面的InvocationHandler和Proxy)。
静态代理由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。

示例
这里我们举一个静态代理的例子:
类图:

/**
 * 游戏者接口
 *
 */
public interface IGamePlayer { 

  // 登录游戏
  public void login(String user, String password); 

  // 杀怪,网络游戏的主要特色
  public void killBoss(); 

  // 升级
  public void upgrade(); 

} 
/**
 * 游戏者
 *
 */
public class GamePlayer implements IGamePlayer { 

  private String name = ""; 

  // 通过构造函数传递名称
  public GamePlayer(String _name) {
    this.name = _name;
  } 

  // 打怪,最期望的就是杀老怪 

  public void killBoss() { 

    System.out.println(this.name + " 在打怪!"); 

  } 

  // 进游戏之前你肯定要登录吧,这是一个必要条件
  public void login(String user, String password) {
    System.out.println("登录名为" + user + " 的角色 " + this.name + "登录成功!");
  } 

  // 升级,升级有很多方法,花钱买是一种,做任务也是一种
  public void upgrade() {
    System.out.println(this.name + " 又升了一级!");
  } 

} 
/**
 * 客户端 对被代理对象不可见
 */
public class GamePlayerProxy implements IGamePlayer { 

  private IGamePlayer gamePlayer = null;//被代理对象 

  // 通过构造函数传递要对谁进行代练
  public GamePlayerProxy(String username) {
    this.gamePlayer = new GamePlayer(username);
  } 

  // 代练杀怪
  public void killBoss() {
    this.gamePlayer.killBoss();
  } 

  // 代练登录
  public void login(String user, String password) {
    this.gamePlayer.login(user, password);
  } 

  // 代练升级
  public void upgrade() {
    this.gamePlayer.upgrade();
  } 

}
/*
 * 客户端 对被代理对象不可见
 */
public class GamePlayerProxy2 implements IGamePlayer { 

  private IGamePlayer gamePlayer = null;//被代理对象 

  // 通过构造函数传递要对谁进行代练
  public GamePlayerProxy2(String username) {
    this.gamePlayer = new GamePlayer(username);
  } 

  // 代练杀怪
  public void killBoss() {
    this.gamePlayer.killBoss();
  } 

  // 代练登录
  public void login(String user, String password) {
    System.out.println("登录时间是:" + new Date().toLocaleString());
    this.gamePlayer.login(user, password);
  } 

  // 代练升级
  public void upgrade() {
    this.gamePlayer.upgrade();
    System.out.println("升级时间是:" + new Date().toLocaleString());
  } 

}
/*
 * 客户端 对被代理对象不可见
 */
public class GamePlayerProxy3 { 

  private IGamePlayer gamePlayer;
  // 通过构造函数传递 被代练(代理)对象
  public GamePlayerProxy3(IGamePlayer gamePlayer) {
     this.gamePlayer = gamePlayer;
     System.out.println("我是一名代练,我玩的角色是别人的,可以动态传递进来");
  } 

  public IGamePlayer getProxy() {
    return (IGamePlayer) Proxy.newProxyInstance(this.getClass().getClassLoader(),
        new Class[]{IGamePlayer.class}, new MyInvocationHandler());
  } 

  private class MyInvocationHandler implements InvocationHandler { 

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      if (method.getName().equals("login")) {
        System.out.println("登录时间是:" + new Date().toLocaleString());
      } if (method.getName().equals("upgrade")) {
        System.out.println("升级时间是:" + new Date().toLocaleString());
      }
      method.invoke(gamePlayer, args);
      return null;
    } 

  }
}
public class Test {
  public static void main(String[] args) {
    /*
     * 普通的静态代理: 客户端不知道被代理对象,由代理对象完成其功能的调用
     */
    IGamePlayer proxy = new GamePlayerProxy("X");
    System.out.println("开始时间是:" + new Date().toLocaleString());
    proxy.login("zhangSan", "abcd");
    proxy.killBoss();
    proxy.upgrade();
    System.out.println("结束时间是:" + new Date().toLocaleString()); 

    System.out.println(); 

    /*
     * 代理对象 增强了 被代理对象的功能
     */
    IGamePlayer proxy2 = new GamePlayerProxy2("M");
    proxy2.login("lisi", "efg");
    proxy2.killBoss();
    proxy2.upgrade(); 

    System.out.println(); 

    /*
     * 动态代理:使用jdk提供的InvocationHandler,反射调用被代理对象的方法
     * 结合java.reflect.Proxy 产生代理对象
     * 动态传入被代理对象构造InvocationHandler,在handler中的invoke时可以增强被代理对象的方法的功能
     * 或者说:(面向切面:)在什么地方(连接点), 执行什么行为(通知)
     * GamePlayerProxy3中是方法名为login时通知开始时间,upgrade时通知结束时间
     */
    GamePlayerProxy3 dynamic = new GamePlayerProxy3(new GamePlayer("Y"));
    IGamePlayer dynamicPlayer = dynamic.getProxy();
    dynamicPlayer.login("wangwu", "1234");
    dynamicPlayer.killBoss();
    dynamicPlayer.upgrade();
    /*
     * 面向切面: 一些相似的业务逻辑需要加在众多的地方,那们就可以把它提取到切面中, 切面也就是事务切面:如日志切面、权限切面、业务切面
     */
  }
}

打印:

开始时间是:2014-10-8 17:19:05
登录名为zhangSan 的角色 X登录成功!
X 在打怪!
X 又升了一级!
结束时间是:2014-10-8 17:19:05 

登录时间是:2014-10-8 17:19:05
登录名为lisi 的角色 M登录成功!
M 在打怪!
M 又升了一级!
升级时间是:2014-10-8 17:19:05 

我是一名代练,我玩的角色是别人的,可以动态传递进来
登录时间是:2014-10-8 17:19:05
登录名为wangwu 的角色 Y登录成功!
Y 在打怪!
升级时间是:2014-10-8 17:19:05
Y 又升了一级!

 优点 
 (1)职责清晰
 真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
 (2)代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。
 (3)高扩展性

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, 设计模式
代理模式
cas 代理模式 实例、java代理模式实例、代理模式实例、gradle多项目构建实例、胜任力模型构建实例,以便于您获取更多的相关知识。

时间: 2024-10-28 15:54:30

Java使用设计模式中的代理模式构建项目的实例展示_java的相关文章

Java运用设计模式中的建造者模式构建项目的实例解析_java

1.建造者模式概念定义: 将一个复杂的对象构建与其表示相分离,使得同样的构建过程可以创建不同的表示: 核心 : 构建与表示分离,同构建不同表示 区别于 抽象工厂模式 : (1)与抽象工厂模式 相似,因为它也可以创建复杂对象.主要的区别是建造者模式着重于 一步步构造一个复杂对象,关注的是零件类型和装配工艺的顺序 .而抽象工厂模式着重于多个系列的产品对象(简单的或是复杂的).建造者模式在最后的一步返回产品,而对于抽象工厂来说,产品是立即返回的. (2)在建造者模式里,有个指导者,由指导者来管理建造者

java 遍历request中的所有表单数据的实例代码_java

实例如下: Enumeration rnames=request.getParameterNames(); for (Enumeration e = rnames ; e.hasMoreElements() ;) { String thisName=e.nextElement().toString(); String thisValue=request.getParameter(thisName); System.out.println(thisName+"-------"+thisV

浅析设计模式中的代理模式在C++编程中的运用_C 语言

由遇到的问题引出代理模式 至少在以下集中情况下可以用代理模式解决问题: 创建开销大的对象时候,比如显示一幅大的图片,我们将这个创建的过程交给代理去完成,GoF 称之为虚代理(Virtual Proxy): 为网络上的对象创建一个局部的本地代理,比如要操作一个网络上的一个对象(网络性能不好的时候,问题尤其突出),我们将这个操纵的过程交给一个代理去完成,GoF 称之为远程代理(Remote Proxy): 对对象进行控制访问的时候,比如在 Jive 论坛中不同权限的用户(如管理员.普通用户等)将获得

实例讲解如何在iOS应用开发中使用设计模式中的代理模式_IOS

代理模式是OC中一种常见的设计模式,那么什么是代理模式呢?举个栗子,假设你是一个日发货量过万的淘宝卖家(A),但是每天的派件不可能你本人或者让你的员工去派件,因此你发布了一条信息(B),上面注明各种要求,各大快递公司看到有那么大的利益纷纷上门沟通,最后你选择了一件快递公司(C).那么在上面的例子中,我们即是委托人,发布的信息即协议(protocol),上面规定了派件人需要完成的事,而最后选择的快递公司也就是代理人(delegate),代理我们去派件. 类图: 根据以上类图,可以知道在代理模式中的

Ruby使用设计模式中的代理模式与装饰模式的代码实例_ruby专题

代理模式 需求: 小明让小李替他追小丽(送洋娃娃,送花,送巧克力) 没有代理的代码: # -*- encoding: utf-8 -*- #追求者类 class Pursuit attr_accessor :mm def initialize(mm) @mm = mm end def give_dolls puts "#{mm.name} 送你洋娃娃" end def give_flowers puts "#{mm.name} 送你鲜花" end def give_

JAVA 静态代理模式详解及实例应用_java

JAVA 静态代理模式 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 代理模式说白了就是"真实对象"的代表,在访问对象时引入一定程度的间接性,因为这种间接性可以附加多种用途. 在这实现代码之前,先讲一个简单的生活故事,我们都知道我们周边有很多公司有房屋买卖或租赁的业务,比如链家(LianJia),但链家本身是不存在任何实际房屋资产的,他所售卖租赁的房屋均需要房屋产权所有人(HomeMaster)提供,才得以实现公司的房源需求:同时公司要的卖房租房业务均需要公司

Objective-C中的委托(代理)模式

       我个人更喜欢把委托(Delegate)模式称为代理(Proxy)模式.还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的.当时学习Spring的时候用到了接口回调,其实就是实现的委托代理模式.简单的说代理就是把相应的功能交给实现接口的相应的类中来解决.在OC中没有接口该如何实现代理呢?前面的博客中笔者说提了一句,在OC中的协议和Java中的接口极为相似,都是只声明方法而不去实现,方法的实现在OC中交个遵循协议的类,而在Java中方法的实现交

Java IO 包中的Decorator模式

JDK为程序员提供了大量的类库,而为了保持类库的可重用性,可扩展性和灵活性,其中使用到了大量的设计模式,本文将介绍JDK的I/O包中使用到的Decorator模式,并运用此模式,实现一个新的输出流类. Decorator模式简介 Decorator模式又名包装器(Wrapper),它的主要用途在于给一个对象动态的添加一些额外的职责.与生成子类相比,它更具有灵活性. 有时候,我们需要为一个对象而不是整个类添加一些新的功能,比如,给一个文本区添加一个滚动条的功能.我们可以使用继承机制来实现这一功能,

详解设计模式中的模板方法模式及在C++中的使用_C 语言

模板方法模式是设计模式行为型中最简单的一种设计模式.在实际中你甚至可能经常用到,只是你自己不知道它是一种设计模式罢了. 模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.角色:抽象类(AbstractClass): 定义抽象的原语操作,具体的子类将重定义它们以实现一个算法,实现一个模板方法,定义一个算法的骨架.该模板方法不仅调用原语操作,也调用定义 具体子类 (ConcreteClass): 实现原语操作以完