设计模式----代理模式

今天来介绍一种相对简单的设计模式 ---- 代理模式

比如说你想追一位女生,但是你跟她不熟,就可以找一个你和她都很熟的Proxy(代理)去完成你想要进行的动作

不要想歪哦,我说的是送礼物之类的 (doge)

我们首先来看这个设计模式的类图

是不是很简单哇~

看看代码~

package proxy.template;

/**@author 陈柏宇
 * Subject类,定义了 RealSubject 和 Proxy(代理) 的共用接口,这样就在任何使用RealSubject
 * 的地方都可以使用Proxy(代理)
 * 这个类里面的方法也就是 RealSubject 希望 Proxy(代理) 代理的方法
 */

public abstract class Subject {
    /**
      * 抽象方法,RealSubject 希望 Proxy(代理) 代理的方法
     */
    public abstract void request();

}
package proxy.template;

/**
 * @author 陈柏宇
 * 真实实体 真正意愿的实体
 */

public class RealSubject extends Subject{
    @Override
    public void request() {
        System.out.println("真实实体的请求");
    }
}
package proxy.template;

/**
 * @author 陈柏宇
 * 代理者 代理真实实体的动作
 */

public class Proxy extends Subject{
    RealSubject realSubject;

    @Override
    public void request() {
        if(realSubject == null)
        {
            realSubject = new RealSubject();
        }
        realSubject.request();
    }
}

客户端代码:

 public static void main(String[] args) {

        Proxy proxy = new Proxy();
        proxy.request();

    }

终端显示:

真实实体的请求

接下来我们来看一个例子:比如说你想追一位女生,你让一个人来代理你的动作

package proxy;

/**
 * @author 陈柏宇
 * 送礼物接口 代理者代理的我要送的礼物
 */

public abstract class IGivePresent {
    /**
     * 送玩偶 (不是Hong Kong的那位)
     */
    public abstract void giveDoll();
    /**
     * 送巧克力
     */
    public abstract void giveChocolate();
    /**
     * 送鲜花
     */
    public abstract void giveFlower();

}
package proxy;

/**
 * @author 陈柏宇
 * 追求者 动作的意愿发起者
 */

public class Pursuit extends IGivePresent{
    SchoolGirl mm;

    public Pursuit(SchoolGirl mm) {
        this.mm = mm;
    }

    @Override
    public void giveDoll() {
        System.out.println( "送你玩偶,我亲爱的" + mm.getName());
    }

    @Override
    public void giveChocolate() {
        System.out.println( "送你巧克力,我亲爱的" + mm.getName());
    }

    @Override
    public void giveFlower() {
        System.out.println( "送你鲜花,我亲爱的" + mm.getName());
    }
}
package proxy;

/**
 * @author 陈柏宇
 * 代理,用来发出追求者想发出的动作
 */

public class Proxy extends IGivePresent{
    Pursuit pursuit;

    public Proxy(SchoolGirl mm) {
        this.pursuit = new Pursuit(mm);
    }

    @Override
    public void giveDoll() {
        pursuit.giveDoll();
    }

    @Override
    public void giveChocolate() {
        pursuit.giveChocolate();
    }

    @Override
    public void giveFlower() {
        pursuit.giveFlower();
    }
}

main函数:

public class ProxyTest {
    public static void main(String[] args) {
        SchoolGirl mm = new SchoolGirl("beauty");

        Proxy p = new Proxy(mm);

        p.giveChocolate();
        p.giveDoll();
        p.giveFlower();
        
    }
}

控制台输出:

送你巧克力,我亲爱的beauty
送你玩偶,我亲爱的beauty
送你鲜花,我亲爱的beauty

是不是很简单呀~

那么这个设计模式有哪些应用呢?

/**
 * @author cby
 * 那么这种设计模式一般用在什么场合呢?
 * 
 * (1)远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象
 * 存在于不同地址空间的事实
 *    就好比一个快捷方式,我们的桌面图标的应用往往都不在桌面的那个文件夹里
 *    
 * (2)虚拟代理,根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象
 *    比如你打开一个很大的HTML网页时里面可能有很多的图片和文字,但是你还是可以很快打开它
 *    此时你所看到的是所有的文字,但是图片是一张张下载才可以看到,那些未打开的图片框,
 *    就是通过虚拟代理来替代了真实的图片,此时代理存储了真实图片的路径和尺寸
 *    
 * (3)安全代理,用来控制真实对象访问时的权限
 *    
 * (4)智能指引:是指当调用真实的对象时,代理处理另外一件事
 *      
 */

 

posted @ 2021-08-24 17:24  Apak陈柏宇  阅读(66)  评论(0编辑  收藏  举报