“Java”代理模式你真的用好了吗???

Java 设计模式:代理模式

定义:为其它对象提供一种代理,以控制对这个对象的访问。

使用场景:当无法或不想直接访问某个对象,亦或是访问某个对象存在困难时,可以通过一个代理对象来进行间接访问。

为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口。

示例

感觉文字表述枯燥?那让柯南举个栗子:

  • 从前有个哥们欠了小明一大笔钱,拖欠了几年还没还,于是小明通过法律途径来解决这个问题。
  • 既然选择了通过法律途径解决问题,那么小明就得请个律师来作为自己的代理诉讼人,而不是直接跟法院进行沟通。

也就是说,律师需要作为小明跟法院的中间代理人负责相互传递消息。示意图如下:

示例代码如下:

// 抽象出诉讼行为步骤的接口
public interface ILawsuit {
    void summit();  // 提交申请
    void burden();  // 进行举证
    void defend();  // 开始辩护
    void finish();  // 诉讼完成
}
// 小明 (实现了诉讼接口)
public class XiaoMing implements ILawsuit {
    @Override
    public void summit() {
        System.out.println("小明:有人欠钱不还,当然提交诉讼。");
    }

    @Override
    public void burden() {
        System.out.println("小明:这是借条和转账记录。");
    }

    @Override
    public void defend() {
        System.out.println("小明:证据确凿,就让法院裁决。");
    }

    @Override
    public void finish() {
        System.out.println("小明:诉讼成功,判决欠款人七日内归还借款。");
    }
}

// 律师 (也实现了诉讼接口)
public class Lawer implements ILawsuit{
    private ILawsuit mLawsuit;

    public Lawer(ILawsuit lawsuit) {
        mLawsuit = lawsuit;
    }

    @Override
    public void summit() {
        System.out.println("律师:是否要提交诉讼?");
        mLawsuit.summit();
        System.out.println("律师:已向法院提起诉讼。");

    }

    @Override
    public void burden() {
        System.out.println("律师:请提供相关证据。");
        mLawsuit.burden();
        System.out.println("律师:已提供相关证据到法院。");
    }

    @Override
    public void defend() {
        System.out.println("律师:开庭辩护,是否可以私下协商解决?");
        mLawsuit.defend();
        System.out.println("律师:等待法院的判决结果。");
    }

    @Override
    public void finish() {
        System.out.println("律师:已收到法院的判决结果。");
        mLawsuit.finish();
        System.out.println("律师:结案。");
    }
}

测试代码如下:

public static void main(String[] args) {
    XiaoMing xiaoMing = new XiaoMing();
    Lawer lawer = new Lawer(xiaoMing);
    lawer.summit();
    lawer.burden();
    lawer.defend();
    lawer.finish();
}

日志输出如下:

律师:是否要提交诉讼?
小明:有人欠钱不还,当然提交诉讼。
律师:已向法院提起诉讼。
律师:请提供相关证据。
小明:这是借条和转账记录。
律师:已提供相关证据到法院。
律师:开庭辩护,是否可以私下协商解决?
小明:证据确凿,就让法院裁决。
律师:等待法院的判决结果。
律师:已收到法院的判决结果。
小明:诉讼成功,判决欠款人七日内归还借款。
律师:结案。

从上面的示例和测试代码可以看出,代码模式的使用并不难,主要是一种委托机制的实现。真实对象将方法的执行委托给代理对象,代理对象在执行委托方法的前后,是可以执行一些其它逻辑的。

补充:因为我们已经抽象出了诉讼行为的接口 ILawsuit,律师 Lawer 也对该接口也做了实现。如果有其他人也想发起诉讼的话,在实现 ILawsuit 接口之后,可直接将 Lawer 作为自己的代理。

扩展

生活中还有哪些常用例子?

  • Windows 里面的快捷方式。
  • 买火车票不一定要去车站,可以去代售点。

和适配器模式有什么区别?

  • 适配器模式的目的是为了转换适配对象的接口,而代理模式仅仅是代理接口而不能做任何改变。

和装饰器模式有什么区别?

  • 装饰器模式是为了增强功能,而代理模式是为了加以控制。

代理模式有什么优缺点?

  • 优点:职责清晰,扩展性高,智能化。
  • 缺点:由于增加了代理对象,额外工作量增加,有些类型的代理模式可能会造成请求的处理速度变慢。

总结

这篇文章通过诉讼案件的讲述了代理模式的基本思想和使用姿势,同时也列举了它与其它常见模式的区别。

posted @ 2022-05-08 20:24  一眼万年的星空  阅读(29)  评论(0编辑  收藏  举报