java设计模式-装饰者模式(3)

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

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

主要角色:

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

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

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

具体装饰角色(ManagerA、ManagerB):负责给构件对象"贴上"附加的责任。

代码示例:

人物类(Manager)


 /\*\*

 \* @author 

 \* @since 2019/4/12

 \*/

public interface People {

    void eat();

}

老人(具体装饰角色)


/\*\*

 \* @author 

 \* @since 2019/4/12

 \*/

public class OldPeople implements People {

    /\*\*

     \* 老人只要吃饭

     \*/

    @Override

    public void eat() {

        System.out.println("吃饭");

    }

}

新人(具体装饰角色)


/\*\*

 \* @author 

 \* @since 2019/4/12

 \*/

public class NewPeople implements People {

    private People people;

    public NewPeople(People people) {

        this.people = people;

    }

    @Override

    public void eat() {

        System.out.println("做饭");

        people.eat();

        System.out.println("洗碗");

    }

}

装饰者模式测试


/\*\*

 \* 

 \*/

@Test

public void decorator() {

    /\*\*

     \* 老人只要吃饭就行

     \*/

    People oldPeople=new OldPeople();

    oldPeople.eat();

    System.out.println("-------------------------------");

    /\*\*

     \* 而新人不仅要有老人的特性还有新人应该做的事情

     \*/

    People newPeople=new NewPeople(oldPeople);

    newPeople.eat();

}

优点:

  1. 使用装饰者模式比使用继承更加灵活,因为它选择通过一种动态的方式来扩展一个对象的功能,在运行时可以选择不同的装饰器,从而实现不同的行为。
  2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。
  3. 具体构件类与具体装饰类可以独立变化,他能是低耦合的。用户可以根据需要来增加新的具体构件类和具体装饰类,在使用时再对其进行各种组合,原有代码无须改变,符合"开闭原则"。

缺点:

  1. 被多钟对象做装饰时,使对象变得复杂,排查也变的困难

使用场景:

  1. 需要扩展一个类的功能,或给一个类添加附加职责。
  2. 需要动态的给一个对象添加功能,这些功能可能不明确或者暂时的,可以随时很方便的动态撤销掉。
  3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
  4. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值