Proxy Pattern(代理模式)

解决的问题

开发一个电子书app,可以这样设计:


不使用代理模式.png

每个电子书实例化后,都要占用一些计算机资源(CPU、内存等),那么当电子书多了后,就会有性能问题。
这样情况,可以使用Proxy Pattern进行优化:


使用代理模式.png

图书馆一开始,只是持有电子书的代理,电子书并没有真正的实例化。等到要打开电子书时,才会真正地实例化电子书。通过这样的方式解决的性能问题。

代码

EBook:

package com.cong.designpattern.proxy;

public interface EBook {
    public String getName();
    public void open();
}

RealEBook:

package com.cong.designpattern.proxy;

public class RealEBook implements EBook{
    private String name;
    public RealEBook(String name) {
        this.name = name;
        this.load();
    }
    private void load() {
        System.out.println("Load ebook " + this.name);
    }
    @Override
    public String getName() {
        return this.name;
    }
    @Override
    public void open() {
        System.out.println("Open " + this.name);
    }
}

EBookProxy:

package com.cong.designpattern.proxy;

public class EBookProxy implements EBook{
    private RealEBook realEBook;
    private String name;
    public EBookProxy(String name) {
        this.name = name;
    }
    @Override
    public String getName() {
        return this.name;
    }
    @Override
    public void open() {
       if (this.realEBook == null) this.realEBook = new RealEBook(this.name);
       this.realEBook.open();
    }
}

Library:

package com.cong.designpattern.proxy;

import java.util.HashMap;
import java.util.Map;

public class Library {
    private Map<String, EBook> eBookMap = new HashMap<>();
    public void add(EBook eBook) {
        this.eBookMap.put(eBook.getName(), eBook);
    }
    public EBook getEBook(String name) {
        return  this.eBookMap.get(name);
    }
}

Test code:

Library library = new Library();
String[] names = {"a", "b", "c", "d", "e"};
for (String name:names) library.add(new EBookProxy(name));

EBook eBook = library.getEBook("a");
eBook.open();
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 代理模式(Proxy Pattern):代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。这种...
    涅槃快乐是金阅读 3,304评论 0 0
  • 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式...
    _凌浩雨阅读 3,658评论 0 1
  • 定义: 其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理...
    Java天天阅读 780评论 0 0
  • 代理模式 定义:为其他对象提供一种代理以控制对这个对象的访问。 场景: 小明喜欢小红,却不敢向小红献殷勤。小明找他...
    辣么大大大大阅读 1,690评论 0 0
  • 代理模式 也称为 委托模式。 其实代理在我们日常生活中并不少见,对于程序员来说最常接触的莫过于代理上网。 定义 为...
    一个追寻者的故事阅读 1,033评论 0 0