一直想在博客里写点东西,给大家分享一下,今天终于静下心来,写了一点小东西,期待各位朋友指点
写程序到了一定的时候发现设计模式是越来越重要了,一个好的程序框架,不但能很好的方便开发者修改,拓展程序,也能让开发变得更简单。看了《Advanced.ActionScript.3.with.Design.Patterns》和Head First 的《设计模式》好几遍,觉得有点晦涩难懂,最大的问题是怎么应用到实际项目中这才是我们学习设计模式真正目的。
首先我先来讲一下装饰者模式,装饰者模式最大的好处是能够让我们给程序动态的穿衣服,当然需要的时候还可以给她脱掉。。。。。。
第一步:创建一个接口,书上都是用的抽象类,但我觉得用接口应该是更灵活一点,他可以很容易在显示类或者非显示类中去实现接口,如果是抽象类的话可能不那么方便了
package src
{
import flash.display.Sprite;
/**
* ...
* @author yufeng5259
*/
public interface IComponent
{
function get price():Number;
function operator():void;
function get displayContent():Sprite;
}
}
第二步:创建被装饰对象,我的代码是继承的SPRITE类,里面什么都没穿,你可以根据你的项目需要去写,只要是实现了接口方法就可以了
package src
{
import flash.display.Sprite;
import src.IComponent;
/**
* ...
* @author yufeng5259
*/
public class DisplayComponent extends Sprite implements IComponent
{
private var _price:Number = 0;
public function DisplayComponent()
{
}
public function operator():void {
}
public function get displayContent():Sprite { return this };
public function get price():Number { return _price; }
}
}
第三步:创建装饰者类
第一个装饰者是画一个正方形,给他一个价值
package src.decortor
{
import flash.display.Sprite;
import src.IComponent;
/**
* ...
* @author yufeng5259
*/
public class DecortorA implements IComponent
{
private var _component:IComponent;
public function DecortorA(comp:IComponent)
{
_component = comp;
}
public function operator():void {
_component.displayContent.graphics.beginFill(0xff0000);
_component.displayContent.graphics.drawRect(0, 0, 100, 100);
_component.displayContent.graphics.endFill();
}
public function get price():Number {
return _component.price+100; }
public function get component():IComponent { return _component; }
public function get displayContent():Sprite { return _component.displayContent};
}
}
第二个装饰者是画一个圆同样也给他一个价值
package src.decortor
{
import flash.display.Sprite;
import src.decortor.DecortorA;
import src.IComponent;
/**
* ...
* @author yufeng5259
*/
public class DecortorB implements IComponent
{
private var _component:IComponent;
public function DecortorB(comp:IComponent)
{
_component = comp;
}
public function operator():void
{
_component.displayContent.graphics.beginFill(0x2fccfc);
_component.displayContent.graphics.drawCircle(200, 100, 100);
_component.displayContent.graphics.endFill();
}
public function get price():Number {
return _component.price + 200;
}
public function get component():IComponent { return _component; }
public function get displayContent():Sprite { return _component.displayContent};
}
}
最后:我们来看看效果吧
package
{
import flash.display.Sprite;
import src.decortor.DecortorA;
import src.decortor.DecortorB;
import src.DisplayComponent;
import src.IComponent;
/**
* ...
* @author yufeng5259
*/
public class DecoratorDemo extends Sprite
{
private var comp:IComponent;
public function DecoratorDemo()
{
comp = new DisplayComponent();人出来了
comp = new DecortorA(comp);先穿内裤
comp.operator();
trace(comp.price);
comp = new DecortorB(comp);再穿内衣,这下不怕丢人了
comp.operator();
trace(comp.price);衣服的价格也一块算出来了,真是很方便啊:)
this.addChild(comp.displayContent);出来让大家看看吧
}
}
}
浙公网安备 33010602011771号