设计模式 简单学『装饰者模式』

定义:

  在不必改变原类文件和原类使用的继承的情况下,动态地扩展一个对象的功能。
它是通过创建一个包装对象,也就是用装饰来包裹真实的对象来实现。

角色:

1.抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象。
2.具体构件角色(Employe):定义一个将要接收附加责任的类。
3.装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口。
4.具体装饰角色(MoernPerson、MoernPerson1..):负责给构件对象“贴上”附加的责任。

看图

设计模式 简单学『装饰者模式』_第1张图片

代码实现

1.抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象。

interface Person {  
    public void eat();  
}

2.具体构件角色(Employe):定义一个将要接收附加责任的类。

class OldPerson implements Person {
    @Override  
    public void eat() {
        //原始人 什么都不做生吃,肠胃好。
        System.out.println("吃饭");  
    }  
} 

3.装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口。

abstract class NewPersn implements Person{
    Person p;  
    public abstract void fire();
}

4.具体装饰角色(MoernPerson、MoernPerson1..):负责给构件对象“贴上”附加的责任。

class ModernPerson  extends NewPersn {  

    ModernPerson(Person p) {  
        this.p = p;  
    }  

    @Override
    public void eat() {  
        //现代人,生火烹饪
        fire();
        p.eat();  
    }
    @Override
    public void fire() {
           System.out.println("生火/烹饪(现代人不再茹毛饮血了)");   
    }  
}  

Main

public class DecoratorPattern {

    public static void main(String[] args) {
        Person p = new OldPerson();
        System.out.println("--------------------未装饰----------------------");
        p.eat();

        System.out.println("--------------------装饰后/增加生火功能----------------------");
        Person np = new ModernPerson(p);
        np.eat();
    }

}

输出
设计模式 简单学『装饰者模式』_第2张图片

使用场景:

  • 需要扩展一个类的功能,或给一个类添加附加职责。

  • 需要动态的给一个对象添加功能,这些功能可能不明确或者暂时的,可以随时很方便的动态撤销掉。

  • 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。

  • 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

转载内容有修改,已取得作者授权。原文链接: Java知音: 23种设计模式(6)-装饰者模式

你可能感兴趣的:(JavaSE)