zoukankan      html  css  js  c++  java
  • 代理模式-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 
  • 相关阅读:
    为用户分配角色 C#
    测试常用指标及工具
    MySQL Performance Schema
    CentOS7
    sysbench
    Fedora 的截屏功能
    Fedora 26 安装搜狗拼音输入法 sogoupinyin
    下载 GitHub 上保存在 AWS 的文件
    MySQL 架构
    Vagrant
  • 原文地址:https://www.cnblogs.com/feimaoyuzhubaobao/p/10055995.html
Copyright © 2011-2022 走看看