10、装饰者模式

一、装饰者模式定义

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

 

二、装饰者的应用场景

  1、想透明并且动态地给对象增加新的职责的时候  

  2、给对象增加的职责,在未来存在增加或减少可能。

  3、用继承扩展功能不太实现的情况下,应该考虑用组合方式

 

三、装饰模式的优点

   1、装饰者模式与继承关系的目的都是要扩展对象的功能,但是decorator可以提供比继承更多灵活性。

    2、通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

 

四、装饰者模式的缺点

  1、这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。

  2、装饰者模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。

 

五、装饰者模式的实现 

package Decorator;

/**
 * Created by Administrator on 2018/3/2 0002.
 */
public class Decorator extends Hero{
    @Override
    public String getPower() {
        return super.getPower();
    }
}
public class Hero {
    public String power="我是普通英雄";
    public String getPower(){
        return this.power;
    }
}
public class FamaleHero extends Hero{
    FamaleHero(){
        this.power+=" 女性";
    }
}
public class MaleHero extends Hero{
    MaleHero(){
        this.power+=" 男性";
    }
}
public class Eat extends Decorator {
    Hero hero=new Hero();
    Eat(Hero hero){
        this.hero=hero;
    }

    @Override
    public String getPower() {
        return hero.getPower()+" 会吃饭";
    }
}
public class Fight extends Decorator {
    Hero hero=new Hero();
    Fight(Hero hero){
        this.hero=hero;
    }

    @Override
    public String getPower() {
        return hero.getPower()+" 会打斗";
    }
}
public class Player {
    public static void main(String[] args) {
        Hero hero1=new Hero();
        System.out.println(hero1.getPower());

        MaleHero mh=new MaleHero();
        System.out.println(mh.getPower());

        Fight fmh=new Fight(mh);
        System.out.println(fmh.getPower());

        Eat efmh=new Eat(fmh);
        System.out.println(efmh.getPower());

    }
}

 六、装饰者模式和适配器模式的区别

 

posted @ 2018-03-08 17:29  彩电  阅读(145)  评论(0编辑  收藏  举报