2. 结构型模式 (3) 代理模式

阅读更多
2. 结构型模式 (3) 代理模式

代理模式(Proxy Pattern)中,一个类代表另一个类的功能。创建具有现有对象的对象,以便向外界提供功能接口。

优点:
1. 职责清晰。
2. 高扩展性。
3. 智能化。

缺点:
1. 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
2. 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。


1. 代理模式

package com.andrew.pattern0203.proxy.model01;
public interface Image {
    void display();
}


package com.andrew.pattern0203.proxy.model01;
public class RealImage implements Image {
    private String fileName;
    public RealImage(String fileName) {
        this.fileName = fileName;
        loadFromDisk(fileName);
    }
    @Override
    public void display() {
        System.out.println("Displaying:" + fileName);
    }
    private void loadFromDisk(String fileName) {
        System.out.println("Loading:" + fileName);
    }
}


package com.andrew.pattern0203.proxy.model01;
public class ProxyImage implements Image {
    private RealImage realImage;
    private String fileName;
    public ProxyImage(String fileName) {
        this.fileName = fileName;
    }
    @Override
    public void display() {
        if (null == realImage) {
            realImage = new RealImage(fileName);
        }
        realImage.display();
    }
}


package com.andrew.pattern0203.proxy.model01;
/**
 * 1. 代理模式
 * 
 * @author andrew
 * @date 2018/07/01
 */
public class Client {
    public static void main(String[] args) {
        Image image = new ProxyImage("test_img.jpg");
        image.display();
        System.out.println("");
        image.display();
    }
}
运行结果:
Loading:test_img.jpg
Displaying:test_img.jpg

Displaying:test_img.jpg


2. Java中代理模式

public abstract class Subject{
    public abstract void request();
}


public class RealSubject extends Subject{
    public void request(){
        System.out.println("From real subject.");
    }
}


public class ProxySubject extends Subject{
    private RealSubject realSubject; //代理角色内部引用了真实角色
    public void request(){
        this.preRequest(); //在真实角色操作之前所附加的操作
        if(null == realSubject){
            realSubject = new RealSubject();
        }
        realSubject.request(); //真实角色所完成的事情
        this.postRequest(); //在真实角色操作之后所附加的操作
    }
    private void preRequest(){
        System.out.println("pre request");
    }
    private void postRequest(){
        System.out.println("post request");
    }
}


public class Client{
    public static void main(String[] args){
        Subject subject = new ProxySubject();
        subject.request();
    }
}
运行结果:
pre request
From real subject.
post request

你可能感兴趣的:(java,设计模式)