- 浏览: 198254 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
yixinhu:
你好 能加下你的QQ么 我怎么打出来的exe点击都没反应啊.. ...
java 生成exe 文件 -
chenxiang105:
如果不需要flash 只需要做图片的翻页效果 这个是否也合适类 ...
jQuery插件page peel AD实现动态卷页、翻页或卷角flash广告效果 -
tuoxie007:
幸苦,好文章!
jetspeed门户项目组介绍 -
bobo:
需要考虑不同浏览器的兼容性
通过网页访问本地资源程序 -
tag13346:
说得这么玄,看下
时空趋势理论 --- 超越时空的均线技术(转载 )
定义:为另一个对象提供一个替身或者战位符以范围这个对象。
要点:
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;
}
}
发表评论
-
Iterator patten 读书笔记
2008-04-10 18:07 1031提供 一种方法 顺序访问 一个聚和 对象中的各个元素,而又不暴 ... -
模版模式 读书笔记
2008-04-10 18:04 1707在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版 ... -
Facade patten 读书笔记
2008-04-10 18:03 959提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一 ... -
Adapter patten 读书笔记
2008-04-10 18:01 924将一个类的接口,转换成客户期待的另一个接口。适配器让原本接口不 ... -
command patten 读书笔记
2008-04-10 17:56 8731 。命令模式将发出请求的对象和执行请求的对象解耦。 2。在被 ... -
单例模式 读书笔记
2008-04-07 18:44 880确保一个类只有一个实 ... -
抽象工厂模式读书笔记
2008-04-07 18:39 946提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具 ... -
工厂方法 读书笔记
2008-04-03 14:27 1107工厂发法定义了一个创建对象的接口或者抽象类,但是有子类来决定要 ... -
装饰者模式 读书笔记
2008-04-03 14:25 2102package pattern; public clas ... -
观察者模式(读书笔记)
2008-04-01 18:33 1071观察者模式定义了对象之间的一对多依赖,这样一来当一个对象改变状 ... -
Head First Design Patterns 读后感3-策略模式
2008-04-01 18:32 1300策略模式-定义了算法族,分别封装起来,让他们之间可以相互替换, ... -
Head First Design Patterns 读后感2 设计原则
2008-03-31 13:47 11311。软件开发中唯一一个不变的是 变化。大千世界,千奇百怪,行行 ... -
Head First Design Patterns 读后感1
2008-03-31 13:46 1386如何让大脑把记得更深刻 1。慢点,你理解的越多,记得月少 2。 ... -
阅读不懂,图书之过——《大话设计模式》创作历程 (转载)
2008-03-28 11:41 1088写这本书的确是个意外,因为在之前,我和所有的做技术的朋友一样, ... -
state patten 读书笔记
2008-03-25 14:53 1181允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的 ... -
组合模式 读书笔记
2008-03-24 15:12 1256允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能 ...
相关推荐
除了提供主要功能的python软件包外,JupyterLab扩展名( @jupyterlab/server-proxy )在JupyterLab启动器窗口中还提供了一些按钮,例如RStudio。 注意:该项目以前称为nbserverproxy 。 由于nbserverproxy是...
proxy源代码,linux下的ftp 代理的源代码,大家多多支持啊
FoxyProxy 是一款高级代理服务器管理工具,是 Firefox 火狐浏览器的代理插件,相比比 SwitchProxy、ProxyButton、QuickProxy、xyzproxy、ProxyTex 等扩展提供更多的功能。 FoxyProxy 通过使用通配符、正则表达式和...
apache Proxy Error apache Proxy Error apache Proxy Error apache Proxy Error
三思笔记\[三思笔记]全面学习MySQL Proxy特性.pdf
esri.config.defaults.io.proxyUrl is not set所缺文件 proxy.jsp、proxy.ashx、proxy.php、proxy.config
ABAP 调用ABAP PROXY
2014最新版proxy lab参考答案,小伙伴快来吧!
mysqlproxy笔记mysqlproxy笔记
book 2020 for proxy settings
Google Chrome插件: Proxy SwitchOmega 2.5.15. 轻松快捷地管理和切换多个代理设置. 离线插件使用方法: 1. 打开Chrome -> 自定义及控制按钮(右上角) -> 更多工具 -> 扩展程序 (有可能需要打开开发者模式) 2. 拖拽...
forum proxy leecher 1.11forum proxy leecher 1.11forum proxy leecher 1.11forum proxy leecher 1.11
simple proxy
OPC Proxy Foundation
MySQL Proxy 实现负载均衡测试 MySQL Proxy 实现负载均衡测试
Proxy服务器连网结构Proxy服务器连网结构Proxy服务器连网结构Proxy服务器连网结构Proxy服务器连网Proxy服务器连网结构结构Proxy服务器连网结构Proxy服务器连网结构
一个功能强大的代理软件,通过简单的配置即可实现快速透传
此文比较详细讲述了Nginx与proxy共同搭建反向代理服务的配置方法
ProxyServer (Android 2.1+).apk
列表包含 mod_proxy.so mod_proxy_http.so mod_proxy_ajp.so mod_proxy_ftp.so mod_proxy_connect.so mod_proxy_balancer.so