`
_念-H
  • 浏览: 9396 次
  • 性别: 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的代理模式通过代理类提供了对委托类的扩展和控制,静态代理适合对已有代码不做修改的情况,而动态代理则提供了更高的灵活性和扩展性。在实际应用中,应根据项目需求和性能考虑选择静态代理或动态代理。对于需要...

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

    代理模式在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