代理模式-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 
posted @ 2018-12-02 22:48  肥猫与猪宝宝  阅读(155)  评论(0编辑  收藏  举报