代理模式-静态代理

代理模式通过代理对象控制对目标对象的访问,增强主业务逻辑而不修改目标对象。静态代理在程序运行前已定义好,代理类与目标类确立关系。包括抽象角色、代理角色和真实角色三个部分。在实际应用中,客户类通过代理对象调用目标对象的业务方法。动态代理则解决了静态代理中多个真实对象对应多个代理对象的问题。
摘要由CSDN通过智能技术生成

代理模式是指,为其他对象提供一种代理以控制这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户类和目标对象之间起到中介的作用。
换句话说,使用代理对象,是为了在不修改目标对象的基础上,增强主业务逻辑。
客户类真正想要访问的对象是目标对象,但客户类真正可以访问的对象是代理对象。客户类对目标对象的访问是通过访问代理对象来实现的。当然,代理类与目标类要实现同一个接口。

根据代理关系建立的时间不同,可以将代理分为两类:静态代理与动态代理。
静态代理是指,代理类在程序运行前就已经定义好,其与目标类的关系在程序运行前就已经确立。

组成
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。


(1)定义业务接口GameService,其中含有抽象方法gameStart()。

public interface GameService {
    //主业务逻辑
    void gameStart();
}

(2)定义目标类GameServiceImpl,该类实现了业务接口。在对接口方法的实现上,只实现主业务逻辑即可。这个方法称为目标方法。

public class GameServiceImpl implements GameService {
    //目标方法
    @Override
    public void gameStart() {
        System.out.println("这里调用Dao层,开始记录娱乐进程!!!");
    }
}

(3)定义代理类GameServiceImplProxy。这个类要实现GameService接口。并且该代理类要将接口对象作为一个成员变量,还要定义一个带参的构造器,这个参数为接口对象。目的是,将目标对象引入代理类,以便代理类调用目标类的目标方法。

/* 定义代理类,与目标类实现相同的业务接口 */
public class GameServiceImplProxy implements GameService {
    //声明业务接口对象
    private GameService target;
    public GameServiceImplProxy(){}
    public GameServiceImplProxy(GameService target){
        this.target = target;
    }
    /* 代理方法,实现对目标方法的功能增强 */
    @Override
    public void gameStart() {
        //此处为对目标类的增强
        System.out.println("***验证是否还有钻石***");
        target.gameStart();
    }
}

(4)定义客户类Client。在客户类中首先要创建目标对象,再创建代理对象,并使用目标对象对其进行初始化。然后由代理对象来调用执行业务方法。

    public static void main(String[] args) {
        //创建目标对象
        GameService target = new GameServiceImpl();
        //创建代理对象,并使用目标对象初始化它
        GameService service = new GameServiceImplProxy(target);
        //此时执行的内容,就是对目标对象增加过的内容
        service.gameStart();
    }


客户端实际上直接面对的是代理角色。
动态代理可以解决这种情况:静态代理模式有一个不好的地方,使用静态代理,将真实对象作为代理对象内部的属性,一个真实对象必须要对应一个代理对象,当有很多的真实对象需要代理,会有大量的与之对应的代理对象

希望对你有帮助,祝你有一个好心情,加油!

若有错误、不全、可优化的点,欢迎纠正与补充!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值