美文网首页
Proxy Pattern(代理模式)

Proxy Pattern(代理模式)

作者: 杨志聪 | 来源:发表于2024-06-26 10:40 被阅读0次

    解决的问题

    开发一个电子书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(代理模式)

          本文链接:https://www.haomeiwen.com/subject/qifscjtx.html