`
_念-H
  • 浏览: 9741 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

代理模式(静态\动态代理)

    博客分类:
  • JAVA
阅读更多
1、静态代理

      接口有几个方法,代理类则实现几个方法,代码冗余。

/**
 * 接口
 * @author YLJ
 *
 */
public interface Animal {
	public void say();
	public void sleep();
}
/**
 * 实现类,实现接口,实现方法
 * @author YLJ
 *
 */
class Dog implements Animal{
	@Override
	public void say() {
		System.out.println("dog say");
	}

	@Override
	public void sleep() {
		System.out.println("dog sleep");
		
	}
}
/**
 * 实现类,实现接口,实现方法
 * @author YLJ
 *
 */
class Cat implements Animal {

	@Override
	public void say() {
		System.out.println("cat say");
	}

	@Override
	public void sleep() {
		System.out.println("cay sleep");
	}
}
/**
 * 代理类,实现接口,实现方法(调用实际角色方法,并添加附加功能)
 * @author YLJ
 *
 */
class Proxy implements Animal {
	private Animal animal;
	public Proxy(Animal animal){
		this.animal = animal;
	}
	@Override
	public void say() {
		System.out.println("proxy say...");
		animal.say();
	}
	@Override
	public void sleep() {
		System.out.println("proxy sleep...");
		animal.sleep();
	}
}

    测试

/**
 * 测试类
 * @author YLJ
 *
 */
public class App {
	
	public static void main(String[] args) {
		Proxy dog = new Proxy(new Dog());
		dog.say();
		dog.sleep();
		Proxy cat = new Proxy(new Cat());
		cat.say();
		cat.sleep();
		
	}
}
2、动态代理
/**
 * 接口
 * @author YLJ
 *
 */
public interface Animal {
	void say();
	void sleep();
}
/**
 * 实现类
 * @author YLJ
 *
 */
class Dog implements Animal{
	private String name;
	public Dog(String name) {
		this.name = name;
	}
	public void say(){
		System.out.println(this.name + ": say。。。");
	}
	public void sleep() {
		System.out.println(this.name + ": say。。。");
	}
	
}
/**
 * 实现类
 * @author YLJ
 *
 */
class Cat implements Animal{
	private String name;
	public Cat(String name) {
		this.name = name;
	}
	public void say(){
		System.out.println(this.name + ": say。。。");
	}
	public void sleep() {
		System.out.println(this.name + ": say。。。");
	}
}

class AnimalHandler implements InvocationHandler{
	private Animal animal;
	public AnimalHandler(Animal animal) {
		this.animal = animal;
	}
	/**
	 * 核心方法,实现所有代理方法调用,
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("proxy...");
		method.invoke(animal, args);
		return null;
	}

}

   测试

public static void main(String[] args) {
		Animal dog = new Dog("旺财");
		AnimalHandler dogHandler  = new AnimalHandler(dog);
		Animal d = (Animal)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Animal.class}, dogHandler);
		d.say();
		d.sleep();
		Animal cat = new Dog("猫咪");
		AnimalHandler catHandler  = new AnimalHandler(cat);
		Animal c = (Animal)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Animal.class}, catHandler);
		c.say();
		c.sleep();
		
	}

 

 

分享到:
评论

相关推荐

    Java设计模式——代理设计模式(静态代理和动态代理)

    代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了代理关系,代理类和真实类的关系是硬编码在代理类中的。下面我们将详细介绍静态代理的实现方式: 1. **定义接口**:...

    java静态代理、动态代理、装饰设计模式

    Java提供了两种实现代理的主要方式:静态代理和动态代理。 **静态代理** 静态代理是最基础的形式,它需要程序员手动创建一个代理类,该类实现了与目标类相同的接口。代理类持有目标类的引用,并在调用目标类方法...

    代理模式-静态动态代理-jdk动态代理-cglib动态代理

    在Java中,代理模式有多种实现方式,包括静态代理、JDK动态代理和CGLIB动态代理。 **静态代理** 静态代理是最早也是最基础的代理实现方式。在静态代理中,我们需要创建一个代理类,这个代理类与原始类(被代理类)...

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    代理模式可以进一步细分为静态代理和动态代理。 - **静态代理**:在程序编译时就已经确定代理类的具体实现方式。这意味着每次需要代理不同的操作时,都需要修改代理类的代码,这违反了软件工程中的开闭原则。 - **...

    Java静态代理和动态代理

    Java的代理模式通过代理类提供了对委托类的扩展和控制,静态代理适合对已有代码不做修改的情况,而动态代理则提供了更高的灵活性和扩展性。在实际应用中,应根据项目需求和性能考虑选择静态代理或动态代理。对于需要...

    代理模式(Proxy Pattern) 1. 概述 1.1 基本概念 1.2 为什么需要代理模式 1.3 代理模式的四个角色 2. 代理模式的类型 2.1 静态代理 2.2 JDK动态代理

    代理模式(Proxy Pattern) 1. 概述 1.1 基本概念 1.2 为什么需要代理模式 ...9.2 静态代理与动态代理应该如何选择? 9.3 Spring AOP使用的是什么代理模式? 9.4 CGLIB代理和JDK动态代理有什么区别? 10. 总结

    代理模式的各种实现 (动态代理、静态代理)

    代理模式在Java中主要有两种实现方式:静态代理和动态代理,其中动态代理又分为JDK动态代理和CGlib代理。 1. 静态代理 静态代理是程序员手动创建代理类并实现与目标类相同接口的方式。在静态代理中,代理类和目标类...

    优秀的设计模式示例-静态代理模式

    随着Java等语言的发展,动态代理(如Java的`java.lang.reflect.Proxy`)和C#的`System.Reflection.Emit`等技术,可以更灵活地创建代理对象,克服了静态代理的部分局限性。 总之,静态代理模式提供了一种在不修改...

    Java 静态代理模式

    Java静态代理模式是一种设计模式,它允许我们为一个对象提供一个代理,以便增强或扩展其功能,...然而,由于其存在的局限性,如需更灵活的代理机制,可以考虑使用Java的动态代理模式(如Java.lang.reflect.Proxy)。

    JAVA静态代理和动态代理

    Java提供了两种主要的代理实现方式:静态代理和动态代理。 **静态代理** 静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的...

    静态代理和动态代理

    根据实现方式的不同,代理模式可以分为静态代理和动态代理两种。 ### 静态代理 静态代理是在编译时就已经确定了代理关系。我们需要创建一个代理类,该类实现与目标对象相同的接口,并在代理类的方法中调用目标对象...

    包含静态代理和动态代理demo代码

    在这个“包含静态代理和动态代理demo代码”的压缩包中,我们可能会看到两种常见的Java代理实现方式的示例:静态代理和动态代理。 首先,我们来详细讲解静态代理。在静态代理中,代理类和真实类(目标类)都是在编译...

    静态代理与动态代理Demo

    代理模式分为静态代理和动态代理两种主要形式,每种都有其特定的应用场景和优势。下面我们将深入探讨这两种代理模式,并通过一个“黄牛买票”的例子来具体说明。 首先,我们来看静态代理。静态代理是程序员在编译时...

    代理模式_静态代理.zip

    设计模式之代理模式_静态代理的一个java实现的demo。主类在Client中。仅代码实现,可供初学者参考使用

    代理模式之动态代理

    在Java编程中,代理模式有静态代理和动态代理两种实现方式。本文将主要探讨动态代理,这是一种更灵活且适用于多种场景的技术。 动态代理通常在需要在调用目标方法前后执行额外操作时使用,例如日志记录、性能监控、...

    设计模式(八)之静态代理模式.zip

    在软件设计领域,设计模式是一种经过验证的、通用的解决方案,用于解决常见...在实际开发中,根据项目需求和场景,可以考虑使用动态代理模式(如Java的`java.lang.reflect.Proxy`)来克服这些缺点,实现更灵活的代理。

    Java静态代理与动态代理demo

    Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 ...

    java 设计模式之代理模式(Proxy Pattern)实现代码及设计详解:动态代理模式、静态代理模式

    代理模式分为两种主要类型:静态代理和动态代理。 **静态代理** 在静态代理中,代理类和目标类都是在编译时就已经确定的。我们首先创建一个目标类接口,然后创建一个实现这个接口的代理类,同时代理类还持有目标类...

Global site tag (gtag.js) - Google Analytics