城市猎人

在一网情深的日子里,谁能说得清是苦是甜,只知道确定了就义无反顾
posts - 1, comments - 7, trackbacks - 0, articles - 89

模式(三):装饰者(decorator)模式

Posted on 2008-07-21 12:15 sailor 阅读(175) 评论(0)  编辑  收藏 所属分类: 模式
1、定义
    动态地将责任附加到对象上。若要扩展功能,装饰着提供了比继承者更有弹性的替代方案。

2、原则
    为交互对象之间的耦合设计而努力
    对扩展开放,对修改关闭

3、适用环境
    在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
    处理那些可以撤消的职责。
    当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

4、本模式中的角色

    抽象构件(Component):给出一个抽象接口,以规范准备接收附加责任的对象。
    具体构件(Concrete Component):定义一个接收到附加责任的类。
    装饰(Decorator):持有一个构件对象的实例,并定义与抽象构件一致的接口。
    具体装饰(Concrete Decorator):负责给构件对象贴上附加的责任。

Decorator.jpg(图例)


具体例子:
先定义抽象构件:
package decorator;
//抽象构件接口
public interface Component{
    
public void sampleOperation();
}

一个具体构件----门:
package decorator;
//具体构件-----门
public class  Door implements Component{
    
//实现方法
    public void sampleOperation(){
        System.out.println(
"build a door");
    }

}

装饰(抽象类):
package decorator;

public abstract class Decorator implements Component{
    
//持有一个构件对象的实例
    private Component component;
    
//构造方法
    public Decorator(Component component){
        
this.component=component;
    }

    
//方法的具体实现
    public  void sampleOperation(){
        component.sampleOperation();
    }

}

具体装饰:
package decorator;
//具体装饰----把手
public class Knob extends Decorator{

    
public Knob(Component component){
        
super(component);
    }

    
    
public void sampleOperation(){
        
super.sampleOperation();
        
//附加的"责任"
        System.out.println("add a knob");
    }

}
package decorator;
//具体装饰----锁
public class Lock extends Decorator{

    
public Lock(Component component){
        
super(component);
    }

    
public void sampleOperation(){
        
super.sampleOperation();
        
//附加"责任"
        System.out.println("add a lock");
    }

}
运行类:
package decorator;

public class DecoratorPattern{
    
public static void main(String[] args){
        Component door
=new Door();
        Component lock
=new Lock(door);
        Component knob
=new Knob(lock);
        knob.sampleOperation();
    }

}

运行结果:
build a door
add a lock
add a knob
Press any key to continue...

参考资料:《Head First 设计模式》
                    设计模式学习笔记(十)--------装饰(Decorator)模式

只有注册用户登录后才能发表评论。


网站导航: