Java结构型设计模式之装饰者模式

装饰者模式顾名思义就是在一个类对象的基础上再包装一层,使得这个类的功能得以扩展,符合了设计原则中的禁止修改,提倡扩展的开闭原则。说到给类扩展其功能,可能大家也会想到代理模式,代理模式是关注在控制对对象的访问的,而装饰者模式可以动态地给类对象添加若干个功能,装饰者模式能分离出装饰者对于被装饰者的业务逻辑。

下面我们来看下实例代码吧

这里我们以买煎饼果子为例子吧,比如我们现在要去街边买一个煎饼果子,有鸡蛋和香肠这两种辅料添加

那么我们先创建一个抽象的煎饼类,里面有煎饼的描述,煎饼的价格信息

然后我们构建一个具体的原味煎饼:这个原味煎饼因为现在暂时什么辅料都没加,所以描述信息就是煎饼,价格是8块。

那么现在我们就要创建一个装饰者了,首先创建一个抽象的装饰者,这个抽象的装饰者里面有一个煎饼对象的成员变量,我们所有的具体装饰类都要继承于这个抽象的装饰者,我们可以想象成一个这个抽象的装饰者就是对一个煎饼对象包装的一层假的装饰,这个装饰是什么都没有的,具体的装饰得交给具体的装饰类去做

创建具体的装饰类(加蛋装饰,加香肠装饰)

通过上面两个具体的装饰类我们应该能明白抽象的装饰类做的就是我们把具体的被装饰类通过具体的装饰类构造函数的参数传入,然后我们在具体的装饰类里面重写抽象的装饰类的接口的方法,这时候具体的装饰就是在这些重写的方法里面实现了,因为这时重写的方法里面调用了父类的方法(抽象的装饰者中的方法,这些方法里面调用的是具体的被装饰类的方法),然后我们这时候再加上自己装饰的信息就完成了对被装饰者装饰的装饰者类了,其实我们这里可以这样理解,抽象的装饰类其实就是一个桥梁,什么桥梁尼?就是我们的装饰者能去装饰被装饰者之间的一个桥梁,装饰者要通过这个桥梁才能去装饰被装饰者,所以说我们的装饰者类必须要继承于抽象的装饰者类。

调用者可以根据装饰类动态地去装饰被装饰者:

装饰者模式总结: 装饰者模式里面其实可以分为4个角色,分别是抽象构建角色,具体构建角色,装饰角色,具体装饰角色

  • 抽象构建角色:通常是指一个抽象类或者一个接口,里面定义了一系列方法,具体指的是具体的被装饰者实现的抽象类或者接口,该抽象类或者接口对于装饰者来说也要继承或者实现。(例如上面例子中的AbstractBatter)
  • 具体构建角色:指的是实现了或者继承了抽象构建角色的子类,在上面的例子中具体指的就是煎饼这个对象。
  • 装饰角色:它是具体装饰角色共同实现的抽象类(也可以是接口),并且持有一个Component类型的对象引用,它的主要作用就是把客户端的调用委派到被装饰类。所有的装饰者类都要继承于这个装饰角色。
  • 具体装饰角色:继承于装饰角色的子类,重写装饰角色实现的接口的方法,在这些重写的方法中去装饰。(例如上面的加蛋装饰者类,加香肠装饰者类)

 优点:

  1.  继承的有力补充,比继承灵活,不改变类对象的原始逻辑情况下能扩展类的功能。
  2.  通过各种装饰类的组合,能够使得被装饰类实现不同的效果。

缺点:会出现更多的代码以及更多额类,增加程序的复杂性,在动态装饰时,多层装饰会更复杂。

猜你喜欢

转载自blog.csdn.net/weixin_37689658/article/details/94638973