静态代理

代理模式

  1. 代理:代理对象主要用来拦截被代理对象的访问
    - 代理对象可以理解为明星的经纪人,被代理对象可以理解为某个明星
  2. 代理对象要持有真实业务对象,即在代理类中创建被代理类的对象
  3. 代理对象和被代理对象,具备相同的行为方法. 实现同一个接口
  4. 代理对象拦截被代理对象的访问,可以修改访问的参数 返回值 甚至拦截访问

代码演示

  • 创建一个接口
/*
 * 描述明星的接口
 */
public interface Star {
	//成员函数 唱歌
	public abstract void sing(double money);
	//综艺节目
	public abstract void liveShow(double money);
	//睡觉
	public abstract void sleep();
}
  • 被代理类的代码
/*
 * 被代理对象 目标业务对象 明星柳岩
 */
public class LiuYan implements Star{
	//唱歌
	public void sing(double money) {
		System.out.println("唱了一首:甜蜜蜜");
		System.out.println("赚了"+money+"元");
	}
	//参加综艺节目
	public void liveShow(double money) {
		System.out.println("参加了:奔跑吧,兄弟");
		System.out.println("赚了"+money+"元");
	}
	//睡觉
	public void sleep() {
		System.out.println("好累啊,休息一会。。。。。");
	}
}
  • 代理类的代码
/*
 * 代理对象 经纪人
 */
public class SuoGe implements Star {
	// 持有被代理对象
	private LiuYan ly = new LiuYan();
	public void sing(double money) {
		// 对money变量进行判断,修改访问参数
		if (money < 100000) {
			System.out.println("滚,穷屌丝,一边玩泥巴去");
			return;
		}
		System.out.println("我抽取了" + money * 0.2 + "元代理费用");
		ly.sing(money * 0.8);
	}
	public void liveShow(double money) {
		// 对money变量进行判断,修改访问参数
		if (money < 500000) {
			System.out.println("滚,穷屌丝,一边玩泥巴去");
			return;
		}
		System.out.println("我抽取了" + money * 0.2 + "元代理费用");
		ly.liveShow(money * 0.8);
	}
	public void sleep() {
	    //不需要拦截和进行操作,直接放行
		ly.sleep();
	}
}
  • 测试
/*
 * 代理模式演示
 */
public class ProxyDemo1 {
	public static void main(String[] args) {
		// 创建LiuYan对象
//		LiuYan ly = new LiuYan();
//		ly.sing(1000);
//		ly.liveShow(5000);
//		ly.sleep();
		//直接访问经纪人
		SuoGe sg = new SuoGe();
		sg.sing(200000);
		System.out.println("-----------------------------------");
		sg.liveShow(1000000);
		System.out.println("-----------------------------------");
		sg.sleep();
	}
}