装饰员设计模式
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使用装饰器设计模式设计。