Java设计模式(9)----------装饰器模式

转载 2018年04月17日 17:00:01


1、介绍

装饰器模式是一种结构型的设计模式。使用该模式的目的是为了较为灵活的对类进行扩展,而且不影响原来类的结构。有同学说可以通过继承的方式进行实现啊,没错,继承的确可以实现,但是继承的成本相对比较高,而且如果涉及到扩展多个功能的话,继承实现起来的成本较大。

装饰器模式的思想是,对原来的类进行一层封装,通过依赖实现扩展。但是装饰器的依赖有两个比较重要的特点。

第一,装饰器的抽象类,依赖的是原来类的接口。装饰器的实现类与原本的类之间,不会存在耦合的现象,两个类可以各自进行对应的变化。这一点与桥接模式是相同的。

第二,装饰器的抽象类会同时继承原来类的接口,从而保证装饰器的实现类具有与原来的类一样的方法,只是装饰器实现类的方法有新的扩展。可以理解为对原有类的某种功能或者特性的加强。这样产生的效果就是,从使用者的角度来看,会更加的便捷,因为原来的类与装饰器类具有一样的方法,真是其中实际的功能和作用进行了加强。

装饰器模式的使用场景,抽象来说就是需要扩展类但是又不想引入子类,或者也可以根据字面的含义,能与装饰或者功能加强有关的场景。比如说,一张画,是可以欣赏的,但是没有办法挂到墙上。那么我们可以找一个相框(装饰器实现类),将画放到相框中,之后就可以把这个带相框的画挂到墙上了。再比如说,我们买了一张床,就可以在上边睡觉了。但是我们希望睡的更加舒服,所以需要在床上增加一个装饰,比如垫上床垫,加上枕头,盖上床单。装饰之后,它依然有承载睡觉的属性。

2、案例

2.1、背景

就举一个上文提到的画与画框的例子。为了提高节操,哦不,是情操,本同学需要观赏(接口)一下工艺品。谈到观赏,我们可以观赏油画和水墨画(接口实现类)。但是油画和水墨画无法挂在墙上让众人欣赏,所以我们希望找一个相框(装饰器抽象类),将画放进去,然后挂起供人欣赏(装饰或者功能加强)。之后,我们终于找到了一个木质的相框(装饰器实现类),装饰之后,具有更好的观赏效果。

2.2、实现

1)定义观赏的接口

public interface Look {
    public String LookAtPic();
}

2)定义观赏的实现类

public class InkPic implements Look
{
    @Override
    public String LookAtPic()
    {
        return "欣赏水墨画";
    }
}
public class OilPic implements Look
{
    @Override
    public String LookAtPic() {
        return "欣赏油画";
    }
}

3)定义装饰器抽象类

public abstract class PicDecorator implements Look
{
    private Look look;
 
    public Look getLook() {
        return look;
    }
 
    public void setLook(Look look) {
        this.look = look;
    }
 
    public PicDecorator(Look look) {
        this.look = look;
    }
 
    @Override
    public abstract String LookAtPic();
}

4)装饰器实现类

public class WoodPicDecorator extends PicDecorator
{
    public WoodPicDecorator(Look look) {
        super(look);
    }
 
    @Override
    public String LookAtPic() {
        return this.getLook().LookAtPic() + ",木质相框";
    }
}

5)运行

public class Test
{
    public static void main(String[] args)
    {
        OilPic oilPic = new OilPic();
        System.out.println(oilPic.LookAtPic());
 
        WoodPicDecorator woodPicDecorator = new WoodPicDecorator(oilPic);
        System.out.println(woodPicDecorator.LookAtPic());
 
        InkPic inkPic = new InkPic();
        System.out.println(inkPic.LookAtPic());
 
        woodPicDecorator = new WoodPicDecorator(inkPic);
        System.out.println(woodPicDecorator.LookAtPic());
    }
}

5)结果

欣赏油画
欣赏油画,木质相框
欣赏水墨画
欣赏水墨画,木质相框

Processfinished with exit code 0

3、总结

装饰器模式的关键代码有两点:第一,装饰器抽象类依赖原接口;第二,装饰器抽象类实现原接口。

优点:低成本扩展类的方法(功能加强)

缺点:这种方法非常精巧,非要找一个缺点的话,那就是精巧的东西一般都不太好理解。

【Java设计模式】- 装饰器模式

概述     装饰器模式:可以动态的为运行时的类添加行为。相比继承而言,继承是直接对某个类的行为进行扩展而装饰器模式是对某个对象进行扩展。     原理:增加一个修饰类去实现被修饰类相同的接口,同...
  • LightOfMiracle
  • LightOfMiracle
  • 2017-06-26 10:32:07
  • 327

《java与设计模式》之装饰模式详解&Java IO中的装饰器模式

1 概述 在一个项目中,你会有非常多的因素考虑不到,特别是业务的变更,不时的冒出一个需求是很正常的情况。有三个继承关系的类:Father、Son、GrandSon,我们要在Son类上增强一些功能怎么办...
  • chs0113
  • chs0113
  • 2016-05-06 19:42:19
  • 9124

[设计模式]-装饰器模式(Decorator)

定义: 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活。 对象结构型模式...
  • qust_2011
  • qust_2011
  • 2016-11-30 19:15:04
  • 781

大话设计模式之装饰器模式

装饰器模式,顾名思义就是在一个原有的类的上增加额外的功能,前提是不能修改类的代码。其实为一个类增加功能,可以用继承来实现,但是这样会使得类的数量层爆炸式增长,每增加一个功能,都会通过继承生成一个新类。...
  • u011811966
  • u011811966
  • 2016-09-27 09:49:29
  • 410

Java设计模式——装饰器模式(Decorator)

孙悟空有七十二般变化,他的每一种变化都给他带来一种附加本领。而不管孙悟空怎么变化在二郎神眼里,他永远是那只猢狲。 装饰器模式以对客户透明的方式动态的给一个对象附加上更多的责任。 在孙悟空的例子里,...
  • fuyuwei2015
  • fuyuwei2015
  • 2015-05-18 21:29:05
  • 786

JAVA IO之装饰器模式(Head first 设计模式之装饰器模式)

InputStream是IO中装饰器模式的顶层,现在我们讨论一下装饰器模式。顾名思义,动态的将责任附加到对象上,如要扩展功能,装饰者提供了比继承更加有弹性的方案。 装饰器模式:首先,装饰者和被装饰者...
  • wangzhenfei444
  • wangzhenfei444
  • 2016-06-20 16:01:03
  • 1059

JAVA开发的23种设计模式之 —  装饰器模式 && 代理器模式

装饰器模式 概述 : 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更加灵活维基百科解释 : 通过使用修饰模式,可以在运行时扩充一个类的功能.原理是 : 增加一个修饰类包...
  • yeguxin
  • yeguxin
  • 2017-08-17 18:20:11
  • 333

读书笔记 HeadFirst设计模式之装饰器(Decorator)模式

概念 装饰器(Decrator)模式属于设计模式中的结构模式,通过装饰里动态的给一些对象增加职责。装饰器模式通常也会被称作包装(Wrapper)模式。装饰器模式包括一下四种角色:   Compone...
  • u013278940
  • u013278940
  • 2016-04-18 16:09:20
  • 373

马士兵设计模式视屏

设计模式 马士兵设计模式
  • guiping_ding
  • guiping_ding
  • 2016-10-23 21:45:06
  • 406

设计模式 —— 装饰器模式(Decorator Pattern)

装饰器模式(Decorator Pattern)概念 装饰器模式 允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,以达到特定的目的。...
  • wwh578867817
  • wwh578867817
  • 2016-05-23 11:46:16
  • 1945
收藏助手
不良信息举报
您举报文章:Java设计模式(9)----------装饰器模式
举报原因:
原因补充:

(最多只允许输入30个字)