• 代理模式-Proxy Pattern


    代理模式Proxy Pattern

    代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难 时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。

    模式结构:

    代理模式的结构比较简单,其核心是代理类。

    (1)  Subject(抽象主题角色):它声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题。

    (2)  Proxy(代理主题角色):它包含了对真实主题的引用,从而可以在任何时候操作真实主题 对象;在代理主题角色中提供一个与真实主题角色相同的接口,以便在任何时候都可以替代 真实主题

    (3)  RealSubject(真实主题角色):它定义了代理角色所代表的真实对象,在真实主题角色中 实现了真实的业务操作

    下面的两个例子是静态代理:

    举例:通过图片代理从磁盘加载图片

    创建图片接口

    1 package com.feimao.proxy.test;
    2 
    3 public interface Image {
    4     public void display();
    5 }

    创建RealImage类

     1 package com.feimao.proxy.test;
     2 
     3 public class RealImage implements Image{
     4     private String filename;
     5     public RealImage(String filename){
     6         this.filename = filename;
     7         loadFromDisk(filename);
     8     }
     9 
    10     @Override
    11     public void display() {
    12         System.out.println("Displaying   " + filename);
    13     }
    14     public void loadFromDisk(String filename){
    15         System.out.println("Loading   " + filename);
    16     }
    17 }

    创建image的代理类ProxyImage

     1 package com.feimao.proxy.test;
     2 
     3 public class ProxyImage implements Image {
     4     private RealImage realImage;
     5     private String filename;
     6     public ProxyImage(String filename){
     7         this.filename = filename;
     8     }
     9 
    10     @Override
    11     public void display() {
    12         if(realImage == null){
    13            realImage = new RealImage(filename);
    14         }
    15         realImage.display();
    16     }
    17 }

    创建测试类

    1 package com.feimao.proxy.test;
    2 
    3 public class ProxyPartternDemo {
    4     public static void main(String[] args){
    5         Image image = new ProxyImage("feimao.jpg");
    6         image.display();
    7     
    8     }
    9 }

    举例:打印日志的代理

    创建UserDao接口

    1 package com.feimao.proxy.test;
    2 
    3 public interface UserDao {
    4     public void delete(String name);
    5 }

    创建UserDao的实现类

     1 package com.feimao.proxy.test;
     2 
     3 
     4 public class UserDaoImpl implements UserDao {
     5 
     6     @Override
     7     public void delete(String name) {
     8         System.out.println("删除成功!");
     9     }
    10 
    11 }

    创建LogProxy代理类

     1 package com.feimao.proxy.test;
     2 
     3 import java.util.logging.Level;
     4 import java.util.logging.Logger;
     5 
     6 public class LogProxy implements UserDao {
     7     Logger logger = Logger.getLogger(this.getClass().getName());
     8     private UserDao dao;
     9     LogProxy(UserDao dao){
    10         this.dao = dao;
    11     }
    12 
    13     @Override
    14     public void delete(String name) {
    15         logger.log(Level.INFO , "before delete");
    16         dao.delete("feimao");
    17         logger.log(Level.INFO , "after delete");
    18     }
    19 }

    创建测试类

     1 package com.feimao.proxy.test;
     2 
     3 public class Test {
     4     public static void main(String[] args){
     5        /* UserDao dao = new UserDaoImpl();
     6         dao.delete("feimao");*/
     7         UserDao dao = new LogProxy(new UserDaoImpl());
     8         dao.delete("feimao");
     9     }
    10 }

    动态代理可以关注另外一篇博客 https://www.cnblogs.com/feimaoyuzhubaobao/p/10034424.html 
  • 相关阅读:
    POJ 3259 Wormholes【BellmanFord】
    POJ 2960 SNim【SG函数的应用】
    ZOJ 3578 Matrixdp水题
    HDU 2897 邂逅明下【bash博弈】
    BellmanFord 算法及其优化【转】
    【转】几个Java的网络爬虫
    thinkphp 反字符 去标签 自动加点 去换行 截取字符串 冰糖
    php 二维数组转 json文本 (jquery datagrid 数据格式) 冰糖
    PHP 汉字转拼音(首拼音,所有拼音) 冰糖
    设为首页与加入收藏 兼容firefox 冰糖
  • 原文地址:https://www.cnblogs.com/feimaoyuzhubaobao/p/10055995.html
Copyright © 2020-2023  润新知