1405/090
AAS3WDP-Chapter 6 Virtual Proxy 虚拟代理模式
按照习惯应该先鬼扯下什么是Virtual Proxy,……话说…还是直接参阅Java设计模式的Virtual Proxy吧,或者看看这个吧:"Java设计模式之虚拟代理模式"。
Flash里边的Loader就是一个代理,书上的说法是这样的,本来一个元件是必须等到加载完成才能加载到显示列表中的,但是用了虚拟代理之后,可以将代理当成一个加载完成后的元件,加入到显示列表中。
下边么,来点代码,先是接口类IProduct.as:
package{
public interface IProduct{
//get method
function getPrice():Number;
function getTitle():String;
//set method
function setPrice(price:Number):void;
function setTitle(title:String):void;
}
}
实现该接口的类Product.as:
package{
import IProduct;
public class Product implements IProduct{
private var _price:Number;
private var _title:String;
public function Product():void{}
//get method
public function getPrice():Number{
return _price;
}
public function getTitle():String{
return _title;
}
//set method
public function setPrice(price:Number):void{
_price=price;
}
public function setTitle(title:String):void{
_title=title;
}
}
}
接着,是代理类XMLProductProxy.as
package{
import IProduct;
import Product;
public class XMLProductProxy implements IProduct{
private var _data:XML;
private var _product:Product;
public function XMLProductProxy(data:XML){
_data=data;
_product=new Product();
}
//get method
public function getPrice():Number{
if(isNaN(_product.getPrice())){
_product.setPrice(Number(_data.price.toString()));
}
return _product.getPrice();
}
public function getTitle():String{
if(_product.getTitle()==null){
_product.setTitle(_data.title.toString());
}
return _product.getTitle();
}
//set method
public function setPrice(price:Number):void{
_data.price=price;
_product.setPrice(price);
}
public function setTitle(title:String):void{
_data.title=title;
_product.setTitle(title);
}
}
}
XMLProductProxy类实现IProduct接口,但是呢又通过另一个具体实现类Product,使用组合来继承Product类所有的方法。
接着就是代理的使用了:
Fla Source:
import XMLProductProxy; import IProduct; var data:XML=<product><title>我是标题</title><price>18.75</price></product>; var product:IProduct=new XMLProductProxy(data); trace(product.getTitle()+"---$"+product.getPrice()); //output 我是标题---$18.75