`
wangpx
  • 浏览: 202464 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

proxy state 读书笔记

阅读更多

定义:为另一个对象提供一个替身或者战位符以范围这个对象。

要点:

1。代理模式为另外一个对象提供代表,以便控制客户对对象的访问,管理访问的方式有许多种。

2。远程带来管理客户和远程对象之间的交会。

3。虚拟代理控制访问实例化开销大的对象。

4。保护代理基于调用者控制对对象方法的访问。

5。代理模式有许多变体,例如:缓存代理,同步代理,防火墙代理和写入时复制代理。

6。代理在结构上类似装饰者,但是目的不同。

7。装饰者模式为对象加上行为,而代理则是控制访问。

8。java内置的代理支持,可以根据需要将来动态代理,并将所有调用分配到所选的处理器。

9。就合其他的包装者一样,代理会造成你的设计中类的数目增加。

 

//虚拟代理

package pattern;

import java.awt.Component;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Hashtable;

import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class ImageProxyTestDrive {

 ImageComponent imageComponent;
 JFrame frame = new JFrame("CD Cover viewer");
 JMenuBar menuBar;
 JMenu menu;
 Hashtable cds = new Hashtable();

 public static void main(String[] args) throws Exception {
  ImageProxyTestDrive testDrive = new ImageProxyTestDrive();
  // TODO Auto-generated method stub

 }

 public ImageProxyTestDrive() throws Exception {
  cds.put("Ambient: Music for Airports", "http://image.club.china.com/3212956/2008/3/27/0.jpg");
  cds.put("Ima","http://image.club.china.com/3934/2008/3/22/0.jpg");
  cds.put("Selected Ambient Works,Vol.2", "http://image.club.china.com/3934/2008/1/22/2.jpg");
  URL initialURL = new URL((String) cds.get("Ima"));
  menuBar = new JMenuBar();
  menu = new JMenu("Favorite CDs");
  menuBar.add(menu);
  frame.setJMenuBar(menuBar);
  
  for (Enumeration e = cds.keys(); e.hasMoreElements();) {
   String name = (String) e.nextElement();
   JMenuItem menuItem = new JMenuItem(name);
   menu.add(menuItem);
   menuItem.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent event) {
     imageComponent.setIcon(new ImageProxy(getCDUrl(event
       .getActionCommand())));
     frame.repaint();
    }
   });
  }
  Icon icon = new ImageProxy(initialURL);
  imageComponent = new ImageComponent(icon);
  frame.getContentPane().add(imageComponent);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setSize(800, 600);
  frame.setVisible(true);
 }

 URL getCDUrl(String name) {
  try {
   return new URL((String) cds.get(name));
  } catch (MalformedURLException e) {
   e.printStackTrace();
   return null;
  }
 }
}

interface Icon {
 int getIconWidth();

 int getIconHeight();

 void paintIcon(final Component c, Graphics g, int x, int y);
}

class ImageProxy implements Icon {
 ImageIcon imageIcon;
 URL imageURL;
 Thread retrievalThread;
 boolean retrieving = false;

 public ImageProxy(URL url) {
  imageURL = url;
 }

 public int getIconWidth() {
  if (imageIcon != null) {
   return imageIcon.getIconWidth();
  } else
   return 500;
 }

 public int getIconHeight() {
  if (imageIcon != null) {
   return imageIcon.getIconHeight();
  } else
   return 400;
 }

 public void paintIcon(final Component c, Graphics g, int x, int y) {
  if (imageIcon != null) {
   imageIcon.paintIcon(c, g, x, y);
  } else {
   g.drawString("Loading CD cover,please wait...", x + 40, y + 40);
   if (!retrieving) {
    retrieving = true;
    retrievalThread = new Thread(new Runnable() {
     public void run() {
      try {
       imageIcon = new ImageIcon(imageURL, "CD Cover");
       c.repaint();
      } catch (Exception e) {
       e.printStackTrace();
      }
     }
    });
    retrievalThread.start();
   }
  }
 }
 
}

class ImageComponent extends JComponent {
 private Icon icon;

 public ImageComponent(Icon icon) {
  this.icon = icon;
 }

 public void setIcon(Icon icon) {
  this.icon = icon;
 }

 public void paintComponent(Graphics g) {
  super.paintComponent(g);
  int w = icon.getIconWidth();
  int h = icon.getIconHeight();
  int x = (800 - w) / 2;
  int y = (600 - h) / 2;
  this.icon.paintIcon(this,  g,  x,  y);
 }

}

//动态代理 和安全代理

 

package pattern;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MatchMakingTestDrive {

 /**
  * @param args
  */
 public static void main(String[] args) {
  MatchMakingTestDrive test=new MatchMakingTestDrive();
  test.drive();

 }
    public MatchMakingTestDrive(){
     //initializeDatabase();
    }
    public void drive(){
     PersonBean joe=new PersonBeanImpl("Joe Javabean");
     PersonBean ownerProxy=getOwnerProxy(joe);
     System.out.println("Name is " + ownerProxy.getName());
     ownerProxy.setInterests("bowling, GO");
     try{
      ownerProxy.setHotOrNotRating(10);
     }catch(Exception e){
      System.out.println("Can't set rating from owner proxy");
     }
     System.out.println("Rating is"+ ownerProxy.getHotOrNotRating());
     PersonBean nonOwnerProxy=getNoOwnerProxy(joe);
     System.out.println("Name is "+ nonOwnerProxy.getName());
     try{
      nonOwnerProxy.setInterests("bowling, Go");
     }catch(Exception e){
      System.out.println("Can't set interests from non owner proxy");
     }
     nonOwnerProxy.setHotOrNotRating(3);
     System.out.println("Rating set from non owner proxy");
     System.out.println("Rating is "+ nonOwnerProxy.getHotOrNotRating());
     
    }
    PersonBean getOwnerProxy(PersonBean person){
     return (PersonBean)Proxy.newProxyInstance(person.getClass().getClassLoader(),person.getClass().getInterfaces(),new OwnerInvocationHandler(person));
    }
    PersonBean getNoOwnerProxy(PersonBean person){
     return (PersonBean)Proxy.newProxyInstance(person.getClass().getClassLoader(),person.getClass().getInterfaces(),new NoOwnerInvocationHandler(person));
    }
}

interface PersonBean {
 String getName();

 String getGender();

 String getInterests();

 int getHotOrNotRating();

 void setName(String name);

 void setGender(String gender);

 void setInterests(String interests);

 void setHotOrNotRating(int rating);

}
class PersonBeanImpl implements PersonBean{
 String name;
 String gender;
 String interests;
 int rating;
 int ratingCount=0;
 public  PersonBeanImpl(String name){
  name=name;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getGender() {
  return gender;
 }
 public int getHotOrNotRating(){
  if(ratingCount==0)return 0;
  return (rating/ratingCount);
 }
 public void setGender(String gender) {
  this.gender = gender;
 }
 public String getInterests() {
  return interests;
 }
 public void setInterests(String interests) {
  this.interests = interests;
 }
 public void setHotOrNotRating(int rating){
  this.rating+=rating;
  ratingCount++;
 }
}

class OwnerInvocationHandler implements InvocationHandler{
 PersonBean person;
 public OwnerInvocationHandler(PersonBean person){
  this.person=person;
 }
 public Object invoke(Object proxy,Method method,Object[] args) throws IllegalAccessException{
  try{
   if(method.getName().startsWith("get")){
    return method.invoke(person, args);
   }else if(method.getName().equals("setHotOrNotRating")){
    throw new IllegalAccessException();
   }else if(method.getName().startsWith("set")){
    return method.invoke(person, args);
   }
  }catch(InvocationTargetException e){
   e.printStackTrace();
  }
  return null;
 }
}

class NoOwnerInvocationHandler implements InvocationHandler{
 PersonBean person;
 public NoOwnerInvocationHandler(PersonBean person){
  this.person=person;
 }
 public Object invoke(Object proxy,Method method,Object[] args) throws IllegalAccessException{
  try{
   if(method.getName().startsWith("get")){
    return method.invoke(person, args);
   }else if(method.getName().equals("setHotOrNotRating")){    
    return method.invoke(person, args);
   }else if(method.getName().startsWith("set")){
    throw new IllegalAccessException();
   }
  }catch(InvocationTargetException e){
   e.printStackTrace();
  }
  return null;
 }
}

  • 大小: 36.8 KB
分享到:
评论

相关推荐

    JAVA与模式读书笔记。

    在《JAVA与模式读书笔记》中,我们探讨的是Java编程语言与设计模式的结合应用,这对于深入理解面向对象编程和提升软件开发能力至关重要。设计模式是软件工程中的最佳实践,它们是解决常见问题的模板,可以提高代码的...

    设计模式的读书总结笔记

    这篇“设计模式的读书总结笔记”是对设计模式深入理解和应用的结晶,包含对各种模式的实例解析、优缺点分析以及如何在实际项目中应用的指导。 一、设计模式的基本概念 设计模式并不直接提供代码实现,而是描述在...

    设计模式学习笔记总结

    这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...

    B站王红元(codewhy)vue课件以及笔记

    - Vue的响应式系统基于数据劫持(Proxy或Object.defineProperty),当数据变化时,视图会自动更新。 - 计算属性和侦听器:计算属性(`computed`)用于根据其他数据计算新的值,侦听器(`watch`)可以监听数据的...

    vue3.0基础语法的练习笔记

    const state = reactive({ name: 'John', age: 30 }); ``` 总结 本笔记对 Vue 3.0 的基础语法进行了实践和总结,包括 Vite 的使用、Hot Module Replacement、Dynamic Import 和 Code Splitting、Setup 函数、Ref ...

    Android学习笔记--Binder

    【Android学习笔记--Binder】 Binder是Android系统中的核心组件,它是Android系统实现进程间通信(IPC,Inter-Process Communication)的主要方式。Binder机制允许不同进程的组件之间进行数据交换和功能调用,就像...

    300Java设计模式部分学习笔记

    2. 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。 3. 桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使它们都可以独立地变化。 4. 组合模式(Composite Pattern):将对象...

    台湾人写的设计模式笔记

    它们包括:责任链(Chain of Responsibility)、命令(Command)、解释器(Interpreter)、迭代器(Iterator)、中介者(Mediator)、备忘录(Memento)、观察者(Observable/Observer)、状态(State)、策略(Strategy)、模板方法...

    vue相关笔记vuex等等

    9. **数据响应**(VUE3-关于数据响应.docx):Vue 3引入了Proxy对象来实现更高效的数据响应,相比Vue 2的Object.defineProperty,Proxy能更好地处理深层数据对象的监听。 10. **自定义指令+本地存储**(Vue5-自定义...

    笔记java546232194@zsw

    "Java笔记:Vuex和Vue生命周期" 在本文中,我们将围绕Java和Vue.js两个主题展开,介绍Vuex、Vue生命周期、函数式组件、响应式系统、 MongoDB数据库等知识点。 Vuex Vuex是一个状态管理模式,它提供了一个 ...

    Java设计模式尚硅谷笔记

    本笔记主要涵盖了多种经典的设计模式,以下是对这些模式的详细解释: 1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。在Java中,通常通过双重检查锁定(Double-Check Locking)或静态内部类...

    设计模式总结笔记设计模式总结笔记

    ### 设计模式总结笔记 #### 一、概述 设计模式是一种在特定上下文中解决软件设计问题的方案。它并不是一种现成的代码片段或者框架,而是一种指导思想,帮助开发者理解如何更好地组织代码来解决问题。设计模式可以...

    良葛格DesignPattern学习笔记

    - **Proxy**(代理模式):为其他对象提供一个代理以控制对这个对象的访问。 ##### 3. 行为型模式 行为型模式关注于对象之间的职责分配。 - **Chain of Responsibility**(责任链模式):使多个对象都有机会处理...

    Head First 设计模式学习笔记(十四)模式的组合使用

    5. **代理模式(Proxy Pattern)**:虽然未明确提及,但代理模式可以用于为对象提供一种代理以控制对这个对象的访问,这在需要添加额外功能或者控制访问权限时非常有用。例如,可能存在一个DuckProxy类,它作为Duck...

    设计模式笔记设计模式笔记

    - 结构型模式:如适配器(Adapter)、桥接(Bridge)、组合(Composite)、装饰(Decorator)、外观(Facade)、享元(Flyweight)和代理(Proxy)。这些模式关注如何组合和组织类与对象,以达到更好的结构和解耦。...

    图解Java设计模式笔记总结word版本.rar

    - **结构型模式**:如适配器(Adapter)、桥接(Bridge)、组合(Composite)、装饰(Decorator)、外观(Facade)、代理(Proxy)和享元(Flyweight),它们关注如何组织类和对象,以形成更大的结构。 - **行为型...

    《设计模式》学习笔记

    ### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...

    设计模式学习笔记

    7. 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 行为型模式涉及对象之间的责任分配,包括: 1. 责任链模式(Chain of Responsibility):将请求沿着处理者链传递,直到有对象处理为止。 2....

    GoF 23种设计模式学习笔记

    "GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...

    WCF学习笔记

    ### WCF学习笔记知识点概述 #### 一、基本概念 - **WCF简介**:WCF(Windows Communication Foundation)是微软推出的一种用于构建服务导向应用程序(SOA)的技术框架。它提供了一种统一的方式来实现跨平台和服务...

Global site tag (gtag.js) - Google Analytics