装饰器模式小结

装饰器模式主要特征是用特殊的方式给对象添加功能职责,实际上,这个装饰器跟我们想象的装饰一棵圣诞树差不多,但又有不同之处。

我的理解是,虽然增加了装饰物,但是这些装饰物不是直接add上去的,之前一直被这个概念搞混。因为这种模式是建立在一个超类的基础上的,例如下图的:Component,所有其他的类都是这个超类的子类,包括具体的组件和装饰类。因此我们装饰的对象,与被装饰的对象,是继承共同的超类的。这也是被装饰的对象可以在保持核心结构不变的情况下改变属性的原因。

也就是说,无论装饰器类增加了什么功能,只要重写了超类的方法,就可以顺利回溯被装饰类的方法。

也就是说,装饰器相当于把一个物品放在礼品盒里面,礼品盒就是装饰类,而整个礼物,还可以实现原来没有包装时候的物品的功能。

用Actionscript3.0的代码实现:

【组件类】即超类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package 
{
    /**
     * 装饰模型中的抽象组件
     * 抽象类
     * @author 橡树小屋
     */
    public class Component
    {
        public var info:String;
        public function getInfo():String {
            return info;
        }
    }
}

【具体组件类】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package 
{
    /**
     * ...
     * @author 橡树小屋
     */
    public class ConcreteComponent extends Component
    {
        public function ConcreteComponent()
        {
            info = "具体组件-";
        }
    }
}

【抽象装饰类】

1
2
3
4
5
6
7
8
9
package 
{
    public class Decorator extends Component
    {
        override public function getInfo():String {
            return info;
        }
    }
}

【具体装饰类】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package 
{
    public class DecConA extends Decorator
    {
        private var components:Component;
        public function DecConA(con:Component)
        {
            components = con;
        }
        override public function getInfo():String {
            return components.getInfo() + "装饰A";
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package 
{
    public class DecConB extends Decorator
    {
        private var components:Component;
        public function DecConB(con:Component)
        {
            components = con;
        }
        override public function getInfo():String {
            return components.getInfo() + "装饰B";
        }
    }
}

【客户端】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package 
{
    public class main extends MovieClip
    {
         
        public function main()
        {
            var obj:Component = new ConcreteComponent();
            obj = new DecConA(obj);
            obj = new DecConB(obj);
            trace(obj.getInfo());
        }
    }
}

 

参考资料:《Actionscript 3.0 设计模式》

posted @   橡树小屋  阅读(834)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
追逐梦想,永不停息
点击右上角即可分享
微信分享提示