`

Decorator 装饰模式

阅读更多

Decorator 装饰模式,对象结构模式,动态的给对象添加额外的职责。就增加功能而言,Decorator 比生成子类更为灵活。

 

Decorator 又叫wrapper,相当于在原来的物体上面又套了个东西,但是不改变原来的接口。它是对某个对象添加一些功能而不是整个类。比如一个文本套了个边框接口没变,然后又套了个滚动条,接口还是没有变。

 

 

Decorator 在actionscript设计模式有讲,他比静态的继承更为灵活、与它的compont不一样,是一个透明的包装可以很容易的添加一个特性。但是,采用Decotor会产生很多的类似的小对象,导致学习它很难,也很难排错。

 

使用Decorator要注意,接口的一致性,当你只要添加一个职责时,没有必要定义抽象Decorator类,保持装饰对象的简单性。当componen本身就很庞大时,使用Decorator的代价是很高的,strategy会好点。

 

 

 


 


 

 

 

装饰器模式采用的是组合而不是继承来给对象添加新的行为。

 

 

参与者:

Component,定义一对象的接口,可以给这个对象动态的添加职责。

ConcreteComponent,定义一对象,可以给这个对象动态的添加职责。

Decorator,维持一个指向Compoennt的对象引用,并定义一个和Components一致的接口。

ConcreteDecorator,向组件添加行为。

 

注意,Decorator是要和被装饰的对象有一致的接口的,和Proxy一样,而Adaptor是个接口转换器,两个接口并没有直接的联系。Composite也是一致的接口,他是强调单个和群体,有一致的接口。

 

 

下面来举个例子说明下,Decorator是怎么用的:

 

 


 

 

AdstractBasicShap .as

package {
    import flash.display.*;
    
    public class AdstractBasicShap extends Sprite {
        public function AdstractBasicShap() {
        
        }
    }
}
 

 

Cicle .as

package {
    import flash.display.*;
    
    public class Cicle extends AdstractBasicShap {
        public function Cicle(radius:Number) {
            graphics.lineStyle(2,0,1);
            graphics.beginFill(0xFFFFFF,0.3);
            graphics.drawCircle(radius,radius,radius);
            graphics.endFill();
        }
    }
}
 

 

Rectangle.as

package {
    import flash.display.*;
    
    public class Rectangle extends AdstractBasicShap {
        public function Rectangle(ShapeWidth:Number,
                        shapHeight:Number,
                        center:Boolean = false) {
			
            graphics.lineStyle(2,0,1);
            graphics.beginFill(0xFFFFFF,0.3);
            graphics.drawRect(center? - ShapeWidth/2:0,center?-shapHeight/2:0,ShapeWidth,shapHeight);
            graphics.endFill();
        }
    }
}
 

 

DraggableSahpe .as

package {
    import flash.display.*;
    import flash.events.*;
	
    public class DraggableSahpe extends AdstractBasicShap {
        private var decorated:AdstractBasicShap;
        public function DraggableSahpe(decorated:AdstractBasicShap) {
            addChild(decorated);
            
            addEventListener(MouseEvent.MOUSE_DOWN,onMouseDownHandler);
            addEventListener(MouseEvent.MOUSE_UP,onMouseUpHandler);
        }
        
        
        private function onMouseDownHandler(e:MouseEvent):void {
            startDrag();
        }
        
        private function onMouseUpHandler(e:MouseEvent):void {
            stopDrag();
        }
        
    }
}
 

 

 

ColorableShape .as

package {
	import flash.geom.*;
    public class ColorableShape extends AdstractBasicShap {
        public function ColorableShape(shape:AdstractBasicShap,
                    red:uint,green:uint,blue:uint) {
            shape.transform.colorTransform = new ColorTransform(red,green,blue);
            addChild(shape);
        }
    }
}
 

 

ResizeableShape .as

package {
	import flash.events.*;
    public class ResizeableShape extends AdstractBasicShap {
        private var decorated:AdstractBasicShap;
        private var isResizing:Boolean;
        private var resizer:AdstractBasicShap;
        
        override public function set width(value:Number):void {
            decorated.width = value;
            resizer.x = value;
        }
        
        override public function set height(value:Number):void {
            decorated.height = value;
            resizer.y = value;
        }
        
        public function ResizeableShape(shape:AdstractBasicShap) {
            decorated = shape;
            addChild(decorated);
            
            resizer = new Rectangle(10,10,true);
            resizer = new ColorableShape(resizer,0.8,0.8,0.8);
            resizer.x = decorated.width;
            resizer.y = decorated.height;
            addChild(resizer);
            
            resizer.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDownHandler);
            resizer.addEventListener(MouseEvent.MOUSE_UP,onMouseUpHandler);
			
        }
        
        private function onMouseDownHandler(e:MouseEvent):void {
			addEventListener(Event.ENTER_FRAME,onEnterframeHandler);
			
            resizer.startDrag(true);
            e.stopImmediatePropagation();
        }
        
        private function onMouseUpHandler(e:MouseEvent):void {
            resizer.stopDrag();
            removeEventListener(Event.ENTER_FRAME,onEnterframeHandler);
        }
        
        private function onEnterframeHandler(e:Event):void {
            if(resizer.x < 0) {
                resizer.x = 0;
            }
            
            if(resizer.y < 0) {
                resizer.y = 0;
            }
            
            decorated.width = resizer.x;
            decorated.height = resizer.y;
        }
    }
}
 

 

 

 

  • 大小: 65.7 KB
  • 大小: 56.1 KB
  • 大小: 88.4 KB
分享到:
评论

相关推荐

    C#设计模式之Decorator 装饰模式

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...

    C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式)

    ### C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式) #### 一、背景介绍 在面向对象编程中,设计模式是一种在特定情况下解决问题的标准化方法。其中,装饰模式(Decorator Pattern)作为结构型模式...

    java Decorator装饰模式例子

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...

    C#面向对象设计模式纵横谈\10 结构型模式Decorator装饰模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第10节:结构型模式Decorator装饰模式

    Java设计模式之-Decorator装饰模式

    Decorator模式,也称为装饰模式,是设计模式中的一个重要组成部分,它在不改变原有对象接口的前提下,动态地给对象添加新的功能,从而扩展了对象的能力。这篇博客()将深入探讨这个模式的细节。 装饰模式的核心...

    C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式) (Level 300)

    装饰模式是一种结构型设计模式,它允许我们向一个对象添加新的功能或增强现有功能,而无需改变该对象的类。在C#中,装饰模式通常通过继承和组合来实现,它提供了一种灵活的方式来动态地改变对象的行为。在这个“C#...

    设计模式之装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...

    装饰器(Decorator)模式

    装饰器(Decorator)模式 装饰器(Decorator)模式是一种典型的结构型模式,主要用意是动态地为对象添加一些额外的功能。它提供了一个灵活的替代方案来继承子类,以扩展对象的功能。 在《Element of Reusable ...

    Decorator装饰者模式

    在装饰者模式中,我们通常有两个主要的角色:Component(组件)和Decorator(装饰器)。Component是被装饰的对象接口,定义了所有装饰器和原始对象共同拥有的行为。Concrete Component是Component的具体实现,是实际...

    设计模式C++学习之装饰模式(Decorator)

    装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。在C++编程语言中,装饰模式常用于动态地扩展类的功能,使得类的行为在...

    装饰者模式——Decorator

    装饰者模式(Decorator)是一种设计模式,用于在运行时动态地给对象添加额外的责任或功能。它是结构型设计模式的一种,能将行为的增加与对象的创建分离,使得我们可以独立地扩展对象的功能。 在Java或其他面向对象...

    c++-设计模式之装饰模式(Decorator)

    装饰模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象接口的情况下,动态地为对象添加额外的职责或功能。装饰模式通常用于需要扩展对象功能而又不希望使用子类化的场景。 装饰模式的组成 组件接口...

    设计模式之 Decorator模式和代码实现

    【Decorator模式】是一种设计模式,它允许在运行时动态地给对象...在实际的软件开发中,Decorator模式同样适用于那些需要动态增减功能的对象,例如在UI设计中添加装饰元素,或者在数据库连接池中添加不同的连接策略等。

    装饰器模式[Decorator]

    装饰器模式(Decorator)是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式属于结构型模式,是面向对象设计中的一种非常实用的技术。 装饰器模式的核心思想是通过将一个...

    装饰模式——装饰模式.doc

    装饰模式是一种设计模式,属于结构型模式,其主要目的是在不改变对象本身的基础上,通过向对象添加新的行为或属性来扩展其功能。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭。 在装饰模式中,有四个关键...

    结构型模式之装饰模式(Decorator)

    装饰模式(Decorator)是软件设计模式中的一种结构型模式,其主要目的是在不改变对象原有类的基础上,通过添加新的行为或职责来扩展对象的功能。这种模式使得代码的扩展性非常优秀,避免了由于频繁地使用继承而导致...

Global site tag (gtag.js) - Google Analytics