代理模式之静态代理的实现


代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式分为静态代理、动态代理。

静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。

就静态代理举个栗子

有两个人,有很多money的张三和24K纯屌丝李四,他们做着做同样的事情——惹上了官司和吃饭,张三就雇用专业的律师打官司,饭自己吃;李四雇不起律师,只好自己上,饭当然也是要自己吃……用静态代理实现如下

要做的事情(接口)

package com.hk.service;
/**
 * 定义一个接口(一类人要做的事情)
 * @author 浪丶荡
 *
 */
public interface ISomeService {
    //打官司
    public String Litigate();
    //吃饭
    public String eat();
}

如果自己做,做的方式是(目标类)

package com.hk.service;
/**
 *  目标类
 * @author 浪丶荡
 *
 */
public class ISomeServiceImp implements ISomeService {

    @Override
    public String Litigate() {
        return "自己打官司,输了";
    }

    @Override
    public String eat() {
        return "自己吃饭";
    }

}

专业律师(代理类)

package com.hk.service;
/**
 *  代理类
 * @author 浪丶荡
 *
 */
public class ServiceProxy implements ISomeService {
    //客户
    private ISomeService target;

    public ServiceProxy() {
    }
    //联系客户接受任务,为谁打官司
    public ServiceProxy(ISomeService target) {
        this.target = target;
    }

    //帮客户打官司
    @Override
    public String Litigate() {
        return "律师打官司,赢了";
    }
    //吃饭就让客户自己吃吧
    @Override
    public String eat() {
        return target.eat();
    }

}

演绎过程(测试类)

package com.hk.test;

import com.hk.service.ISomeService;
import com.hk.service.ISomeServiceImp;
import com.hk.service.ServiceProxy;
public class MyTest {
    public static void main(String[] args) {
        //有money人张三
        ISomeService zhangsan = new ISomeServiceImp();
        //屌丝李四
        ISomeService lisi = new ISomeServiceImp();

        //张三请的律师打官司,饭自己吃
        ISomeService sp = new ServiceProxy(zhangsan);
        System.out.println("zhangsan"+sp.Litigate()+"-----"+sp.eat());
        //苦逼的李四自己打官司,自己吃饭
        System.out.println("lisi"+lisi.Litigate()+"-----"+lisi.eat());
    }
}

结局(结果)

zhangsan律师打官司,赢了-----自己吃饭
lisi自己打官司,输了-----自己吃饭
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值