- 浏览: 202464 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
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 1064提供 一种方法 顺序访问 一个聚和 对象中的各个元素,而又不暴 ... -
模版模式 读书笔记
2008-04-10 18:04 1764在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版 ... -
Facade patten 读书笔记
2008-04-10 18:03 981提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一 ... -
Adapter patten 读书笔记
2008-04-10 18:01 970将一个类的接口,转换成客户期待的另一个接口。适配器让原本接口不 ... -
command patten 读书笔记
2008-04-10 17:56 9121 。命令模式将发出请求的对象和执行请求的对象解耦。 2。在被 ... -
单例模式 读书笔记
2008-04-07 18:44 912确保一个类只有一个实 ... -
抽象工厂模式读书笔记
2008-04-07 18:39 991提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具 ... -
工厂方法 读书笔记
2008-04-03 14:27 1140工厂发法定义了一个创建对象的接口或者抽象类,但是有子类来决定要 ... -
装饰者模式 读书笔记
2008-04-03 14:25 2143package pattern; public clas ... -
观察者模式(读书笔记)
2008-04-01 18:33 1133观察者模式定义了对象之间的一对多依赖,这样一来当一个对象改变状 ... -
Head First Design Patterns 读后感3-策略模式
2008-04-01 18:32 1336策略模式-定义了算法族,分别封装起来,让他们之间可以相互替换, ... -
Head First Design Patterns 读后感2 设计原则
2008-03-31 13:47 11631。软件开发中唯一一个不变的是 变化。大千世界,千奇百怪,行行 ... -
Head First Design Patterns 读后感1
2008-03-31 13:46 1421如何让大脑把记得更深刻 1。慢点,你理解的越多,记得月少 2。 ... -
阅读不懂,图书之过——《大话设计模式》创作历程 (转载)
2008-03-28 11:41 1136写这本书的确是个意外,因为在之前,我和所有的做技术的朋友一样, ... -
state patten 读书笔记
2008-03-25 14:53 1218允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的 ... -
组合模式 读书笔记
2008-03-24 15:12 1321允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能 ...
相关推荐
在《JAVA与模式读书笔记》中,我们探讨的是Java编程语言与设计模式的结合应用,这对于深入理解面向对象编程和提升软件开发能力至关重要。设计模式是软件工程中的最佳实践,它们是解决常见问题的模板,可以提高代码的...
这篇“设计模式的读书总结笔记”是对设计模式深入理解和应用的结晶,包含对各种模式的实例解析、优缺点分析以及如何在实际项目中应用的指导。 一、设计模式的基本概念 设计模式并不直接提供代码实现,而是描述在...
这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...
- Vue的响应式系统基于数据劫持(Proxy或Object.defineProperty),当数据变化时,视图会自动更新。 - 计算属性和侦听器:计算属性(`computed`)用于根据其他数据计算新的值,侦听器(`watch`)可以监听数据的...
const state = reactive({ name: 'John', age: 30 }); ``` 总结 本笔记对 Vue 3.0 的基础语法进行了实践和总结,包括 Vite 的使用、Hot Module Replacement、Dynamic Import 和 Code Splitting、Setup 函数、Ref ...
【Android学习笔记--Binder】 Binder是Android系统中的核心组件,它是Android系统实现进程间通信(IPC,Inter-Process Communication)的主要方式。Binder机制允许不同进程的组件之间进行数据交换和功能调用,就像...
2. 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。 3. 桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使它们都可以独立地变化。 4. 组合模式(Composite Pattern):将对象...
它们包括:责任链(Chain of Responsibility)、命令(Command)、解释器(Interpreter)、迭代器(Iterator)、中介者(Mediator)、备忘录(Memento)、观察者(Observable/Observer)、状态(State)、策略(Strategy)、模板方法...
9. **数据响应**(VUE3-关于数据响应.docx):Vue 3引入了Proxy对象来实现更高效的数据响应,相比Vue 2的Object.defineProperty,Proxy能更好地处理深层数据对象的监听。 10. **自定义指令+本地存储**(Vue5-自定义...
"Java笔记:Vuex和Vue生命周期" 在本文中,我们将围绕Java和Vue.js两个主题展开,介绍Vuex、Vue生命周期、函数式组件、响应式系统、 MongoDB数据库等知识点。 Vuex Vuex是一个状态管理模式,它提供了一个 ...
本笔记主要涵盖了多种经典的设计模式,以下是对这些模式的详细解释: 1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。在Java中,通常通过双重检查锁定(Double-Check Locking)或静态内部类...
### 设计模式总结笔记 #### 一、概述 设计模式是一种在特定上下文中解决软件设计问题的方案。它并不是一种现成的代码片段或者框架,而是一种指导思想,帮助开发者理解如何更好地组织代码来解决问题。设计模式可以...
- **Proxy**(代理模式):为其他对象提供一个代理以控制对这个对象的访问。 ##### 3. 行为型模式 行为型模式关注于对象之间的职责分配。 - **Chain of Responsibility**(责任链模式):使多个对象都有机会处理...
5. **代理模式(Proxy Pattern)**:虽然未明确提及,但代理模式可以用于为对象提供一种代理以控制对这个对象的访问,这在需要添加额外功能或者控制访问权限时非常有用。例如,可能存在一个DuckProxy类,它作为Duck...
- 结构型模式:如适配器(Adapter)、桥接(Bridge)、组合(Composite)、装饰(Decorator)、外观(Facade)、享元(Flyweight)和代理(Proxy)。这些模式关注如何组合和组织类与对象,以达到更好的结构和解耦。...
- **结构型模式**:如适配器(Adapter)、桥接(Bridge)、组合(Composite)、装饰(Decorator)、外观(Facade)、代理(Proxy)和享元(Flyweight),它们关注如何组织类和对象,以形成更大的结构。 - **行为型...
### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...
7. 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 行为型模式涉及对象之间的责任分配,包括: 1. 责任链模式(Chain of Responsibility):将请求沿着处理者链传递,直到有对象处理为止。 2....
"GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...
### WCF学习笔记知识点概述 #### 一、基本概念 - **WCF简介**:WCF(Windows Communication Foundation)是微软推出的一种用于构建服务导向应用程序(SOA)的技术框架。它提供了一种统一的方式来实现跨平台和服务...