装饰员设计模式

时间:2020-02-23 14:36:13  来源:igfitidea点击:

Decorator Design模式(装饰员设计模式)将另外的职责是动态的。
它在另一个对象中包装。
它将扩展对象的函数而不影响任何其他对象.Decorator提供了用于扩展函数的替代。

装饰员设计模式也称w为:

包装(Wrapper)

何时使用它:

使用decoraotor.

  • 在不影响其他对象的情况下为单个对象添加责任。
  • 对于可以撤回的职责,
  • 当通过子类化的扩展是不切实际的。多种许多独立的扩展是可能的,并且将产生用于支持每个组合的子类的爆炸。对于子类别,可以隐藏或者其他方式不可用的子类爆炸。

元素:

  • 零件
  • 为可以为它们添加另外职责的对象定义接口。
  • CONTRETECOMPONENT.
  • 定义可以添加其他职责的对象
  • 装饰者
  • 维护对组件对象的引用,并定义符合组件界面的接口。简单的单词,它具有要装饰的组件对象。
  • CONCRETEDEDORATOR.
  • 为组件对象添加职责。

例子:

在这个例子中,我们将装饰一个带有颜色和窗帘的简单空间。

  • 房间(组件)
  • 它是一个为类创建蓝色印刷品的界面,该界面将具有装饰符
  • 简单组(Concretecomponent)
  • Simpleroom Class的对象将装饰.Aditional职责将动态连接到它。
  • RoomDecorator(装饰)
  • 它包含对房间类的参考,这些程序将装饰。
  • ColordeCorator(CONCROTEDECORATOR)
  • ColordeCorator将为房间添加另外的责任i.e.add颜色。
  • CurtainDecorator(ConcreteDecorator)
  • 窗帘Decorator将增加另外的责任:将窗帘添加到房间。

从逻辑上讲,你能想到的装饰图案的如上述diagram.You将首先创建然后SimpleRoom对象与对象ColorDecorator装饰它,然后所得的装饰物体CuratainDecorator所示。

上述类的Java代码:

下面的接口是描绘室的接口。
room.java(组件):

package org.arpit.javapostsforlearning.designPattern;
 
public interface Room{
  public String showRoom();
}

继类是这个接口的具体实现。
这是将添加装饰器的基类。
simpleeroom.java(concretecomponent):

package org.arpit.javapostsforlearning.designPattern;
 
public class SimpleRoom implements Room {
 
  @Override
  public String showRoom() {
    return "Normal Room";
  }
 
}

继类是装饰类。
它是装饰设计模式的核心。
它包含接口类型的属性。
使用其构造函数在创建装饰器时动态分配实例。
一旦分配了该实例方法将被调用。
roomdecorator.java(装饰员):

package org.arpit.javapostsforlearning.designpattern;
 
abstract class RoomDecorator implements Room{
 
  protected Room specialRoom;
 
  public RoomDecorator (Room specialRoom) {
    this.specialRoom= specialRoom;
  }
 
 public String showRoom() {
    return specialRoom.showRoom();
  }
}

以下程序是我们的具体装饰箱。
它扩展了抽象装饰器。
当创建这个装饰器时,基础实例被传递给调用Super Class构造函数的构造函数。
在Show室()方法中,我们调用基类方法后跟其自己的方法AddColors.this AddColors()将函数添加到基本实例(例如:装饰色彩缤纷)。
Colordecorator.java(CONCRETEDECORATOR):

package org.arpit.javapostsforlearning.designpattern;
 
public class ColorDecorator extends RoomDecorator {
 
  public ColorDecorator (Room specialRoom) {
    super(specialRoom);
  }
 
  public String showRoom() {
    return specialRoom.showRoom() + addColors();
  }
 
  private String addColors() {
    return " + Blue Color";
  }
}

以下类也是类似于上面的CloudtedoCorator类。
地AddCurtains()为房间(基础实例)添加函数,例如:带窗帘的装饰室。
CurtainDecorator.java(CONCRETEDECORATOR):

package org.arpit.javapostsforlearning.designPattern;
 
public class CurtainDecorator extends RoomDecorator {
 
  public CurtainDecorator (Room specialRoom) {
    super(specialRoom);
  }
 
  public String showRoom() {
    return specialRoom.showRoom() + addCurtains();
  }
 
  private String addCurtains() {
    return " + Red Curtains";
  }
}

decoratordesignpatternmain.java:

package org.arpit.javapostsforlearning.designpattern;  
public class DecoratorDesignPatternMain {  
 
 public static void main(String args[]) {  
  Room room = new CurtainDecorator(new ColorDecorator(new SimpleRoom()));  
  System.out.println(room.showRoom());  
 }  
 
}

我创造了一个简单的房间,装饰着颜色和窗帘。

输出:

Normal room + Blue Color + Red Curtains

装饰师设计模式的优点:

  • 它比继承灵活,因为继承在编译时增加了责任,但装饰器模式在运行时添加。
  • 我们可以拥有任何数量的装饰器,也可以任何顺序。
  • 它扩展了对象的函数而不影响任何其他对象。

装饰器设计模式的缺点:

装饰器设计模式的主要缺点是代码可维护性,因为这种模式创造了许多类似装饰器,有时很难维持和区分。

装饰员设计模式在Java API中:

java.io.buffeedreader; java.io.buffeedwriter; java.io.FileReader; java.io.reader;上面的Java API使用装饰器设计模式设计。