【JAVA】 代理Proxy的实现

假设没有中间代理层:

接口

/**
 *
 */

package com.tree.demo.proxy;
/**
 * ClassName:ITalkInterface <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason:   TODO ADD REASON. <br/>
 * Date:     2014年12月25日 下午3:41:56 <br/>
 * @author   chiwei
 * @version
 * @since    JDK 1.6
 * @see
 */
public interface ITalkInterface {

	public String talk(String msg,String who);

}

实现类

package com.tree.demo.proxy;

/**
 * ClassName:Student <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason: TODO ADD REASON. <br/>
 * Date: 2014年12月25日 下午3:46:19 <br/>
 *
 * @author chiwei
 * @version
 * @since JDK 1.6
 * @see
 */
public class Student implements ITalkInterface {

	private String school;

	private String grade;

	private int age;

	public String getSchool() {
		return school;
	}

	public void setSchool(String school) {
		this.school = school;
	}

	public String getGrade() {
		return grade;
	}

	public void setGrade(String grade) {
		this.grade = grade;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Student() {

	}

	public Student(String school, String grade, int age) {
		super();
		this.school = school;
		this.grade = grade;
		this.age = age;
	}

	@Override
	public String talk(String msg, String who) {

		// TODO Auto-generated method stub
		return "Hi " + who + ",I am a Student" + ",I'm in School "
				+ this.getSchool() + ",grade " + this.getGrade() + ","
				+ this.getAge() + " years old ! I want to say " + msg;
	}

}

实现类

package com.tree.demo.proxy;

/**
 * ClassName:Worker <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason: TODO ADD REASON. <br/>
 * Date: 2014年12月25日 下午3:51:16 <br/>
 *
 * @author chiwei
 * @version
 * @since JDK 1.6
 * @see
 */
public class Worker implements ITalkInterface {

	private String factory;

	private double salary;

	public String getFactory() {
		return factory;
	}

	public void setFactory(String factory) {
		this.factory = factory;
	}

	public double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}

	public Worker() {

	}

	public Worker(String factory, double salary) {
		super();
		this.factory = factory;
		this.salary = salary;
	}

	@Override
	public String talk(String msg, String who) {

		// TODO Auto-generated method stub
		return "Worker: " + who + " say " + msg + ",factory:"
				+ this.getFactory() + ",salary:" + this.getSalary();
	}

}

从以上代码,我们看到学生和工人都实现了talk接口,也都重写了额alk方法

这是一个基本的工厂模式!!!!详情请见: http://blog.csdn.net/simonchi/article/details/11921409

这时候如果说学生或者工人都想唱歌怎么办呢?

难道talk接口添加唱歌方法,然后学生和工人实现类都实现唱歌方法???而且还是必须得实现唱歌方法,不唱都不行啊!!!这是不是很坑爹呢?????

这时候我们就需要一个中间代理层来解决这个问题了!!!

代理类

package com.tree.demo.proxy;
/**
 * ClassName:TalkProxy <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason:   TODO ADD REASON. <br/>
 * Date:     2014年12月25日 下午3:55:31 <br/>
 * @author   chiwei
 * @version
 * @since    JDK 1.6
 * @see
 */
public class TalkProxy implements ITalkInterface {

	ITalkInterface talk;

	public TalkProxy(ITalkInterface talk) {
		System.out.println(talk.getClass().getName());
		this.talk = talk;
	}

	@Override
	public String talk(String msg, String who) {

		// TODO Auto-generated method stub
		return talk.talk(msg, who);
	}

	public String sing(String song) {
		return "I am singing a song named " + song;
	}

}

注意此代理类的结构,实现了接口,并且通过构造方法去初始化内部的接口变量,而且在代理类中实现了唱歌!!!

public static void main(String[] args) {

		// TODO Auto-generated method stub
		Student s1 = new Student("TsingHua","1",22);
		System.out.println(s1.talk("s1", "Jim"));
		Worker w1 = new Worker("China Mobile", 2000.0);
		System.out.println(w1.talk("w1", "Tom"));

		TalkProxy tp = new TalkProxy(s1);
		System.out.println(tp.sing("我的中国梦"));

		TalkProxy tp2 = new TalkProxy(w1);
		System.out.println(tp2.sing("咱们老百姓"));

	}

这时候可以看到当学生想唱歌的时候,通过代理类来实现,将学生类对象传给代理类的构造方法即可!!这样当谁想唱歌,谁就代理下就行了!!

这里的代理类的作用也就是代理了一个唱歌的方法,想唱歌就不用再去修改接口,修改实现类了,很简单,很灵活!

如果你还想骂人,就在代理类里添加一个骂人的方法,谁想骂人就传谁进去就行了!!!

时间: 2024-10-11 01:27:41

【JAVA】 代理Proxy的实现的相关文章

java代理Proxy

首先是静态代理: 1 public class Test1 { 2 3 public static void main(String[] args) { 4 IA a = new APoxy(new A()); 5 a.doJob(); 6 } 7 8 } 9 //功能接口 10 interface IA{ 11 public void doJob(); 12 } 13 //委托类 14 class A implements IA{ 15 16 @Override 17 public void

Java 实现代理(Proxy)模式

/** * 游戏者接口 * @author stone * */ public interface IGamePlayer { // 登录游戏 public void login(String user, String password); // 杀怪,网络游戏的主要特色 public void killBoss(); // 升级 public void upgrade(); } /** * 游戏者 * @author stone * */ public class GamePlayer imp

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

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

java 代理模式详解

java 动态代理(JDK和cglib) 设计模式这东东每次看到就明白可过段时间又不能很流利的说出来,今天就用详细的比喻和实例来加深自己的理解(小弟水平不高有不对的地方希望大家能指出来). (1)代理这个词生活中有很多比如在街边卖手机卡.充公交地铁卡的小商店他们都起了代理的作用,java中的代理跟这些小店商的作用是一样的.再比如我想在淘宝上开个服装店但又没有货源怎么办,这时候我就要跟淘宝上某一卖家联系做他的代理.我跟我的商家都要卖衣服(就好比我们都继承了卖衣服的接口sellClothesInte

代理(Proxy)——对象结构型模式

代理模式的意图: 为其它对象提供代理,以控制对这个对象的访问.对一个对象进行访问控制的原因是为了我们在确实需要这个对象时才对它进行创建和初始化.有些对象创建的开销非常大,所以我们应该根据需要进行创建.Proxy则可以代替一个对象,并在需要时负责实例化这个对象.就像我们小学的时候总是欺负学习好的同学,让学习好的同学代替我们写作业,要不然我们放学就在路上堵着打他们,学习好的同学就乖乖的帮我们写作业,第二天到学校老师看了作业还表扬我们学习有进步呢.这就是一个很好的代理模式的例子. 代理模式的类图如下:

Java代理模式

Java代理模式分为静态代理和动态代理模式 静态代理模式比较简单,直接上图和代码: 代理模式类图如下: 在代理模式中的角色: ● 抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象. ● 目标对象角色:定义了代理对象所代表的目标对象. ● 代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象:代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象.代理对象通常在客户端调用传递给目标对象之前或之后,执行某个

java 代理的三种实现方式

Java 代理模式有如下几种实现方式: 1.静态代理. 2.JDK动态代理. 3.CGLIB动态代理. 示例,有一个打招呼的接口.分别有两个实现,说hello,和握手.代码如下. 接口: public interface Greeting { public void doGreet(); } 实现类: public class SayHello implements Greeting { @Override public void doGreet() { System.out.println("

java代理模式学习

Java动态代理模式 1. 代理:一个角色代表别一个角色来完成某些特定的功能. 比如:生产商,中间商,客户这三者这间的关系 客户买产品并不直接与生产商打交道,也不用知道产品是如何产生的,客户只与中间商打交道,而中间商就可以对产品进行一些包装,提供一些售后的服务. 代理模式有三个角色: 1. 抽象主题角色 2. 代理主题角色 3. 实际被代理角色 其它类通过访问代理主题角色来访问实际被代理角色. 2. 下面我们来个一个静态代理的实现. 我以一个坦克为例. 抽象主题角色:Moveable Java代

java代理机制简单实现

java代理分静态代理和动态代理,动态代理有jdk代理和cglib代理两种,在运行时生成新的子类class文件.本文主要练习下动态代理,代码用于备忘.对于代理的原理和机制,网上有很多写的很好的,就不班门弄斧了. jdk代理 Java代码下载    import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Prox

Java 代理使用及代理原理

今天再测试Socket编程时,无法连接外网.公司用的是Http的代理.上网搜索也没看太懂,所以花了大量时间来学习.看了HTTP和TCP协议的关系好,才有所明白.现在能通过Socket使用HTTP代理了,结果很简单,过程却好难. 1. 先简要说说HTTP和TCP(具体内容自行Google,资料很多很全),这里就讲讲要点: HTTP:是应用层协议,是基于传输层协议的. TCP: 是传输层协议,是基于网络层协议的. IP: 是网络层协议. 一个TCP的连接要进行三次握手(就像转户口一样,不详说),HT