静态代理
原创
©著作权归作者所有:来自51CTO博客作者陌上花开缓归矣的原创作品,请联系作者获取转载授权,否则将追究法律责任
静态代理
代理模式
- 代理:代理对象主要用来拦截被代理对象的访问
- 代理对象可以理解为明星的经纪人,被代理对象可以理解为某个明星
- 代理对象要持有真实业务对象,即在代理类中创建被代理类的对象
- 代理对象和被代理对象,具备相同的行为方法. 实现同一个接口
- 代理对象拦截被代理对象的访问,可以修改访问的参数 返回值 甚至拦截访问
代码演示
/*
* 描述明星的接口
*/
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();
}
}