其他分享
首页 > 其他分享> > 1代理模式

1代理模式

作者:互联网

代理模式

代理模式(Proxy Pattern)也叫委托模式,是一个使用率非常高的模式。
1代理模式的定义代理模式的英文原话是:Provide a surrogate or placeHolder for another object to control access to it.意思是:为其他对象提供一种代理以控制对这个对象的访问。
代理模式是一项基本的设计技巧,许多其他模式,如状态模式策略模式访问者模式本质上也采用了代理模式。代理模式提供一下3个角色。一些比较易于理解的例子:1.Windows里的快捷方式。2.猪八戒找高翠兰,结果是孙悟空变的。可以理解为,把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰时看不出来高翠兰这个代理类。3.买火车票不一定在火车站买,也可以去代售点。4.一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。5.spring中的aop。
代理模式的类图
创建抽象主题Subject.java
package com.eric.结构型模式.代理模式.引例;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 抽象主题类
 * @CreateTime 2020-11-28 08:32:13
 */
public interface Subject {
    //定义一个请求方法
    public void request();
}
创建真实主题RealSubject.java
package com.eric.结构型模式.代理模式.引例;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 真实主题
 * @CreateTime 2020-11-28 08:33:10
 */
public class RealSubject implements Subject{
    @Override
    public void request() {
        //业务处理
        System.out.println("我处理了一个业务...");
    }
}
创建代理类ProxySubject.java
package com.eric.结构型模式.代理模式.引例;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 代理主题
 * @CreateTime 2020-11-28 08:34:31
 */
public class ProxySubject implements Subject {
    private Subject subject;
    public ProxySubject(Subject subject){
        this.subject = subject;
    }
    //实现请求方法
    @Override
    public void request() {
        this.beforeRequest();
        subject.request();
        this.afterRequest();
    }

    //请求前操作
    private void beforeRequest()
    {
        //预处理
        System.out.println("代理类的预处理...");
    }
    //请求后的操作
    private void afterRequest()
    {
        System.out.println("代理类的善后处理...");
    }
}

注意事项:
2代理模式的应用    a.代理模式的种类注意: 在所有种类的代理中,虚拟代理远程代理智能代理保护代理是最为常见的代理模式。  
    b.代理模式的优点
    c.代理模式的使用场景
运用很广泛,大到系统框架、企业平台,小到事务处理、代码片段,随处可见代理模式的使用。例如,java RMI的远程调用就是一种代理模式的应用,现在流行的AOP也可以通过代理模式实现。3代理模式实例例1:游戏代练IGamePlayer接口对游戏玩家进行抽象IGamePlayer.java
package com.eric.结构型模式.代理模式.例1;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 游戏接口
 * @CreateTime 2020-11-29 18:01:15
 */
public interface IGamePlayer {
    public void killBoss();//杀Boss
    public void upGrade();//升级
}
GamePlayer实现IGamePlayer接口,是玩家GamePlayer.java
package com.eric.结构型模式.代理模式.例1;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 玩家类
 * @CreateTime 2020-11-29 18:02:38
 */
public class GamePlayer implements IGamePlayer{
    private String name= "";
    public GamePlayer(String name){
        this.name = name;
    }

    public void killBoss(){
        System.out.println(this.name+"杀Boss中...");
    }
    public void upGrade(){
        System.out.println("成功升了一级!!!");
    }
}
代理类则实现IGamePlayer接口,并实现两个私有方法日志和消耗时间方法。GamePlayerProxy.java
package com.eric.结构型模式.代理模式.例1;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 游戏代练
 * @CreateTime 2020-11-29 18:05:44
 */
public class GamePlayerProxy implements IGamePlayer {
    private IGamePlayer player = null;
    public GamePlayerProxy(IGamePlayer player){
        this.player = player;
    }
    //记录打怪时间
    private void log(){
        String pattern = "YYYY-MM-dd HH:mm:ss";
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);

        System.out.println("打怪时间: "+sdf.format(new Date()));
    }

    @Override
    public void killBoss() {
        this.log();
        player.killBoss();
    }

    @Override
    public void upGrade() {
        player.upGrade();
        this.count();
    }
    //计算升级所用时间
    private void count()
    {
        System.out.println("升1级耗费100小时!");
    }
}
测试ClientDemo.java
package com.eric.结构型模式.代理模式.例1;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 测试类
 * @CreateTime 2020-11-29 18:35:46
 */
public class ClientDemo {
    public static void main(String[] args) {
        IGamePlayer player = new GamePlayer("Eric");
        GamePlayerProxy proxy = new GamePlayerProxy(player);

        proxy.killBoss();
        proxy.upGrade();
    }
}
测试结果:
例2:图片的代理我们将创建一个Image接口和实现了Image接口的实体类。ImageProxy是一个代理类,减少RealImage对象加载的内存占用。ProxyPatternDemo类使用ProxyImage来获取要加载的Image对象,并按照需求进行显示。
步骤1创建接口Image.java
package com.eric.结构型模式.代理模式.例2;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 图片接口
 * @CreateTime 2020-11-29 19:03:44
 */
public interface Image {
    void display();
}

步骤2创建接口的实现类RealImage.java
package com.eric.结构型模式.代理模式.例2;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 真实的图片
 * @CreateTime 2020-11-29 19:04:48
 */
public class RealImage implements Image {
    private String fileName;

    public RealImage(String fileName){
        this.fileName = fileName;
        loadFromDisk(fileName);
    }

    @Override
    public void display() {
        System.out.println("正在显示..."+fileName);
    }

    private void loadFromDisk(String fileName){
        System.out.println("从硬盘加载中..."+fileName);
    }
}
ImageProxy.java
package com.eric.结构型模式.代理模式.例2;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 图片代理类
 * @CreateTime 2020-11-29 19:25:24
 */
public class ImageProxy implements  Image {
    private RealImage realImage;
    private String fileName;

    public ImageProxy(String fileName){
        this.fileName = fileName;
    }

    @Override
    public void display() {
        if(realImage == null)
            realImage = new RealImage(fileName);
        realImage.display();
    }

}
步骤三测试
package com.eric.结构型模式.代理模式.例2;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 测试类
 * @CreateTime 2020-11-29 19:28:26
 */
public class ProxyPatternDemo {
    public static void main(String[] args) {
        Image image = new ImageProxy("test01.jpg");
        //图片从硬盘加载
        image.display();
        System.out.println("--------------------");
        //图片不需要从硬盘加载
        image.display();
    }
}
测试结果可以看出第一次从硬盘中加载了图片,而第二次则是从缓存中加载图片。


来自为知笔记(Wiz)

标签:void,代理,模式,fileName,public,Eric
来源: https://www.cnblogs.com/zyl-0110/p/14113449.html