非常艰难地看到第三个模式,书上的东西总是耐人寻味,你反复地看才会有点感觉,而且实践很重要!小弟不才,半解半懂,就急着去写代码,可能部分不是很合理,如果你发现了,请到优快云博客给我留言。
引用里面很经典的一句话:饰模式把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当瀚要执行特殊行为时,客户代码就可以在运行时根
据需要有选择地、按顺序地使用装饰功能包装对象了。
有8个类,还有一个放在falsh主文件里面,主类:Person.as;一级继承类装饰类:Finery.as;二级继承类:BigTrouser.as,LeatherShoes.as,Sneakers.as,Suit.as,Tie.as,TShirts.as。
我感觉最深体会的一点就是this和super还有protected的使用,确实很难理解,突破点在super.Show()上面,而且要从dtx.Show()倒过来推,因为dtx是加载了super.Show(),我们注意到Finery的Show方法中,是如果对象不为空就执行方法Show,然后我们看到dtx.Decorate(kk)加载进来的对象是Finery中的Decorate方法加载的kk对象,如此类推,就实现了包装修饰,现实比较好理解的就是倒过来,第一步是穿大T恤装扮的小菜,第二步再穿上垮裤,最后穿上破球鞋。
Flash主文件
//==============================================================
var xc:Person=new Person();
xc.person("小菜");
trace("第一种装扮:");
var pqx:Sneakers=new Sneakers();
var kk:BigTrouser=new BigTrouser();
var dtx:TShirts=new TShirts();
pqx.Decorate(xc);
kk.Decorate(pqx);
dtx.Decorate(kk);
dtx.Show();
//省略
//trace("第二种装扮:");
//xc.Show();
//==============================================================
//==============================================================
//==============================================================
package {
public class Person {
//最大的不同就是书上那个不知道为什么可以有两个构造函数,我只能通过另一个函数实现,
//否则会提示Person没有构造,因为Finery中用到空的构造函数定义protected var _component:Person;
public function Person(){}
private var myName:String;
public function person(myName:String) {
//初始化
this.myName=myName;
}
public function Show():void{
trace("装扮的"+myName);
}
}
}
//==============================================================
package {
public class Finery extends Person {
protected var _component:Person;
public function Decorate(_component:Person){
this._component=_component;
}
public override function Show():void{
if(_component!=null){
_component.Show();
}
}
}
}
//==============================================================
package {
public class BigTrouser extends Finery{
public override function Show():void{
trace("垮裤");
super.Show();
}
}
}
//==============================================================
package {
public class LeatherShoes extends Finery{
public override function Show():void{
trace("皮鞋");
super.Show();
}
}
}
//==============================================================
package {
public class Sneakers extends Finery{
public override function Show():void{
trace("破球鞋");
super.Show();
}
}
}
//==============================================================
package {
public class Suit extends Finery{
public override function Show():void{
trace("西装");
super.Show();
}
}
}
//==============================================================
package {
public class Tie extends Finery{
public override function Show():void{
trace("领带");
super.Show();
}
}
}
//==============================================================
package {
public class TShirts extends Finery{
public override function Show():void{
trace("大T恤");
super.Show();
}
}
}
//==============================================================