设计模式(四)----装饰模式

断了今生、忘了曾经 提交于 2020-02-29 02:42:39

定义:

    在不必改变原类文件和原类使用的继承的情况下,动态地扩展一个对象的功能。

    它是通过创建一个包装对象,也就是用装饰来包裹真实的对象来实现。

//抽象对象,公共对象
public interface Person {

    public void eat();
}

//被装饰对象
public class OldPerson implements Person {
    public void eat() {
        System.out.println("吃饭");
    }
}

//装饰对象
public class NewPerson implements Person {

    private OldPerson oldPerson;

    public NewPerson(OldPerson oldPerson) {
        this.oldPerson = oldPerson;
    }

    public void eat() {
        System.out.println("生火");
        System.out.println("做饭");
        oldPerson.eat();
        System.out.println("刷碗");
    }
}
//测试类
public class Test {

    public static void main(String[] args) {
        NewPerson newPerson = new NewPerson(new OldPerson());
        newPerson.eat();
    }
}

生火
做饭
吃饭
刷碗

 没有改变原来的OldPerson类,同时也没有定义他的子类而实现了Person的扩展,这就是装饰者模式的作用。

 

优点:

        1,使用装饰者模式比使用继承更加灵活,因为它选择通过一种动态的方式来扩展一个对象的功能,在运行时可以选择不同的装饰器,从而实现不同的行为。

        2,通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。

        3,具体构件类与具体装饰类可以独立变化,他能是低耦合的。用户可以根据需要来增加新的具体构件类和具体装饰类,在使用时再对其进行各种组合,原有代码无须改变,符合“开闭原则”。

 

使用场景:

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

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

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

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

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!