装饰者模式
结合大话设计模式,对装饰者模式进行归纳整理
生活情景
比如物品在原有的功能基础上增加新的功能,比如手机开始只有接打电话发短信功能,然后给添加上播放音乐功能,再添加上播放视频功能,在添加上蓝牙功能等等。
装饰者定义
装饰者模式,动态地给一个对象添加额外的职责,增加功能而言,装饰者模式比生成子类更加灵活(需要体会)。
换句话说,就是为已有功能动态地添加更多的功能 。
装饰者模式解说
当系统增加新功能的时候,是向旧的类中添加新的代码。这些新代码通常装饰了原有类的核心职责或行为。装饰者模式优点在于把类中装饰的功能从类中移除掉了,有效地把类的核心职责和装饰功能分开。
基础功能接口
package com.neutron.decorate;
/**
* 装饰者模式对象接口
* 职责:给对象动态添加职责
*
*
* @author neutron
*
*/
public interface Component {
void operate();
}
装饰者抽象类
package com.neutron.decorate;
import java.util.Objects;
/**
* 装饰者抽象类
*
* 职责:
* 实现Component接口,从外扩展Component接口功能
* 对于Component接口,不需要知道装饰者类Decrator
* 关系:
* 1.Decrator继承Component
* 2.Decrator和Component聚合关系
*
* @author neutron
*
*/
public abstract class Decrator implements Component {
protected Component component;
public Decrator(Component component) {
Objects.requireNonNull(component, "component can't be null");
this.component = component;
}
@Override
public void operate() {
this.component.operate();
}
}
被装饰者类
package com.neutron.decorate;
/**
* 动态添加功能的对象,被装饰者
*
* @author neutron
*
*/
public class RealComponent implements Component {
@Override
public void operate() {
System.err.println("be decorated base called");
}
}
实际装饰者类
package com.neutron.decorate;
public class DecratorA extends Decrator {
public DecratorA(Component component) {
super(component);
}
@Override
public void operate() {
super.operate();
setBehavior();
}
public void setBehavior() {
System.err.println("DecratorA 特有的方法");
}
}
package com.neutron.decorate;
public class DecratorB extends Decrator {
public DecratorB(Component component) {
super(component);
}
@Override
public void operate() {
super.operate();
setBehavior();
}
public void setBehavior() {
System.err.println("DecratorB 特有的方法");
}
}
装饰者客户端
package com.neutron.entity;
import com.neutron.decorate.Decrator;
import com.neutron.decorate.DecratorA;
import com.neutron.decorate.DecratorB;
import com.neutron.decorate.RealComponent;
/**
* 装饰者模式客户端
*
* 从功能角度说:
* decratorA装饰decorated,即decratorA拥有decorated的功能
* decratorB装饰decratorA,即decratorB拥有decratorA和decorated的功能
*
* @author neutron
*
*/
public class DecoraterClent {
public static void main(String[] args) {
// 1.打算给RealComponent进行各种装饰,即动态添加各种功能
RealComponent decorated = new RealComponent();
// 2.使用DecratorA装饰decorated
Decrator decratorA = new DecratorA(decorated);
// 3.使用DecratorB装饰decratorA
Decrator decratorB = new DecratorB(decratorA);
decratorB.operate();
}
}
说明:使用什么方式进行装饰比较。
1.使用set方式进行方法设置,那么方便拓展,便于开发
2.使用构造方法模式进行拓展,比如上面客户端中使用构造方法中参数形式,更适合固定设置,比如API。