java之 代理设计模式

1. 设计一个案例来实现租房功能。分析:在租房的过程中涉及到了3个对象,房东,中介,房客。

中介和房客具有相同的功能--租房。

可以设计如下:

2.上图的设计实际上就是一个代理设计模式---静态代理设计模式。

代理设计模式有4个角色

抽象角色 : 是一个接口,使得真实角色和代理角色具有相同的功能。

真实角色: 实际存在某个功能或权限的角色。

代理角色:代理真实角色实现某种功能。代理角色可以附加另外一些功能。

客户端:使用代理角色。

3.使用代码实现

Rent.java

public interface Rent {
    //租房
    public void rent();
}

Host.java

public class Host implements Rent{
    @Override
    public void rent() {
        System.out.println("========将房屋出租=======");
    }
}

Proxy.java

public class Proxy implements Rent{
    private Host host;

    public Proxy(Host host) {
        super();
        this.host = host;
    }
    @Override
    public void rent() {
        fare();
        host.rent();
        maintance();
    }
    private void fare(){
        System.out.println("-----收取中介费---");
    }
    private void maintance(){
        System.out.println("-----房屋维护---");
    }
    public void setHost(Host host) {
        this.host = host;
    }
}

Client.java

public class Client {
    public static void main(String[] args) {
        Host host = new Host();
        Proxy proxy = new Proxy(host);
        proxy.rent();
    }
}

4.作用

真实角色代码在不增加的情况下,增加了新的功能。

5.应用案例

UserService.java

public interface UserService {
    public void add();
    public void delete();
    public void update();
}

UserServiceImpl.java

/**
 * 在service的方法中,经常会有一些公共的功能,
 * 如:事务,日志,权限,缓存等
 *
 */
public class UserServiceImpl implements UserService{
    @Override
    public void add() {
        System.out.println("add");
    }
    @Override
    public void delete() {
        System.out.println("delete");
    }
    @Override
    public void update() {
        System.out.println("update");
    }
}

UserServiceImplProxy.java

public class UserServiceImplProxy implements UserService{
    private UserService userService;
    @Override
    public void add() {
        LogUtil.log();
        userService.add();
    }

    @Override
    public void delete() {
        LogUtil.log();
        userService.delete();
    }

    @Override
    public void update() {
        LogUtil.log();
        userService.update();
    }

}

LogUtil.java

public class LogUtil {
    public static void log(){
        System.out.println("进入了方法");
    }
}

6.总结

通过以上代码可知,

优点:静态代理实现了公共业务和真实的业务逻辑的分离,降低了耦合,结构更清晰,维护更方便,扩展更容易,分工更明确。

缺点:代码的复杂程度增加,每个业务类都需要有一个相关的代理类,代码量增加-------解决办法:使用动态代理。

原文地址:https://www.cnblogs.com/Vincent-yuan/p/11260911.html

时间: 2024-10-17 04:05:45

java之 代理设计模式的相关文章

Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理

面试问题:Java里的代理设计模式(Proxy Design Pattern)一共有几种实现方式?这个题目很像孔乙己问"茴香豆的茴字有哪几种写法?" 所谓代理模式,是指客户端(Client)并不直接调用实际的对象(下图右下角的RealSubject),而是通过调用代理(Proxy),来间接的调用实际的对象. 代理模式的使用场合,一般是由于客户端不想直接访问实际对象,或者访问实际的对象存在技术上的障碍,因而通过代理对象作为桥梁,来完成间接访问. 实现方式一:静态代理 开发一个接口IDev

java动态代理机制

首先了解代理设计模式,其思想是为其他对象提供一种代理以控制对这个对象的访问. java动态代理就是遵循这种思想,spring中的AOP实现原理就是java的动态代理. 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的. 每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通

java动态代理

要想了解Java动态代理,首先要了解什么叫做代理,熟悉设计模式的朋友一定知道在Gof总结的23种设计模式中,有一种叫做代理(Proxy)的对象结构型模式,动态代理中的代理,指的就是这种设计模式. 在我看来所谓的代理模式,和23种设计模式中的"装饰模式"是一个东西.23种设计模式中将它们作为两种模式,网上也有些文章讲这两种模式的异同,从细节来看,确实可以人为地区分这两种模式,但是抽象到一定高度后,我认为这两种模式是完全一样的.因此学会了代理模式,也就同时掌握了装饰模式. 代理模式 代理模

java 的常用设计模式--大话设计模式

设计模式:一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把锁的模式,目的仅仅是着眼于解决现在的问题,而设计模式的“复杂”就在于它是要构造一个“万能钥匙”,目的是提出一种对所有锁的开锁方案.在真正理解设计模式之前我一直在编写“简单”的代码.这个“简单”不是功能的简单,而是设计的简单.简单的设计意味着缺少灵活性,代码很钢硬,只在这个项目里有用,拿到其它的项目中

java动态代理原理及解析

代理:设计模式 代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 通过代理层这一中间层,有效的控制对于真实委托类对象的直接访问,同时可以实现自定义的控制策略(Spring的AOP机制),设计上获得更大的灵活性. java动态代理的类和接口(jdk1.6源码) 1,java.lang.reflect.Proxy:动态代理机制的主类,提供一组静态方法为一组接口动态的生成对

彻底理解JAVA动态代理

注:本文转自 http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html 代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 代理模式的结构如下图所示. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 代理模式示例代码 public interface Subject { public void doSomething(); } public class RealSubject i

JAVA动态代理详解

1.什么是代理 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 2.什么是动态代理 在程序运行时,运用反射机制动态创建代理实例对象.JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理. 相关类与接口 java.lang.reflect.Proxy:这是 Java 动态代理机制的主类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象. //

Java 动态代理机制分析及扩展,第 1 部分

引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架.通过阅读本文,读者将会对 Java 动态代理机制有更加深入的理解.本文首先从 Java 动态代理的运行机制和特点出发,对其代码进行了分析,推演了动态生成类的内部实现. 回页首 代理:设计模式 代理是一种常用的设计

理解Java动态代理(1)—找我还钱?我出钱要你的命

代理模式是最常用的一个设计模式之一,理解起来也是很简单,一张图足以说明了,LZ就不废话了. 至于代理模式能干嘛也不是LZ今天想说的,今天主要想简单介绍下JAVA里面的动态代理."动"当然是相对"静"来说的,那么什么是静,怎么就又动了呢?LZ想举个生活中常见的例子来说明,俗话说"谈钱伤感情",但生活所迫LZ曾经可没少找人借个一百两百五的,话说借钱一时爽,还钱--(请自行造句),好点的心平气和的委婉的说,横点的就拳脚相加啊.我们来用接口表示下借钱者这