智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...
随笔 - 991, 文章 - 0, 评论 - 27, 阅读 - 341万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

装饰模式(Decorator)

Posted on   Bill Yuan  阅读(370)  评论(0编辑  收藏  举报
在食堂吃饭,没筷子怎么行?我是从来不带饭盆的。师傅很人性化,每个窗口都放着一大把筷子,随用随拿。

这个模式如果用好,有的地方可以很省力。比如,我网站里的滚动条:

复制代码
//ScrollBar.as
//滚动条组件
class ScrollBar extends BaseMovie {
    var BgLength:Number;
    var BlockLength:Number;
    var mcBlock:MovieClip
    var Width:Number;
    var ScrollType;
    var scrollTxt:TextField;
    var scrollMc:MovieClip;
    var McHeight:Number
    var initialY:Number
    function ScrollBar() {
    }
    function InitialScrollBar(BgLength, BlockLength) {
        
this.BlockLength = BlockLength;
        
this.BgLength = BgLength;
    }
    function BindTo(mc,type:String,intMcHeight:Number,yinitial:Number){
        ScrollType
=type;
        
if(type=="TXT"){
            scrollTxt
=mc;
        }
        
if(type=="MC"){
            initialY
=yinitial;
            McHeight
=intMcHeight;
            scrollMc
=mc;
        }
    }
    function Scroll() {
        
if(ScrollType=="TXT")
            
this.onEnterFrame = function() {
                scrollTxt.scroll 
= scrollTxt.maxscroll*mcBlock._y/(BgLength-BlockLength*3/2)
            };
        
if(ScrollType=="MC"){
            
this.onEnterFrame=function(){
                
if(scrollMc._height>McHeight){
                    scrollMc._y 
= initialY - (scrollMc._height - McHeight) * mcBlock._y / (BgLength - BlockLength * 3 / 2)
                    }
            }
        }
    }
    function ScrollMc() {
    }
    function StopScroll() {
        
this.onEnterFrame=null;
    }
    function Reset(){
        mcBlock._y
=0;
    }
}
复制代码

核心函数是BindTo(),把这个滚动条的实例绑定到某个动态文本框或者某个mc上,就可以实现滚动。

备注:装饰模式的思想是,在不影响其他对象的情况下,以动态,透明的方式给单个对象添加职责。

 

装饰者模式应该注意的方面:

1、装饰者和被装饰者一定要是一样的类型,也就是说要有一样的超类。在这里,使用继承达到“类型匹配”,而不是通过继承获得“行为”   ————装饰器模式

2、装饰器模式:动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

3、设计原则:类应该对扩展开放,对修改关闭。

 

(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示