Java设计模式-装饰器模式
目录
装饰器模式
**定义:**装饰器模式又名包装(Wrapper)模式。装饰器模式以对客户端透明的方式拓展对象的功能,是继承关系的一种替代方案
装饰器模式中的角色
- 抽象组件(Component):定义一个接口,已规范准备接收附加责任的对象
- 基体构件(ConcreteComponent):定义一个将要接收附加责任的类(被修饰则)他要实现抽象组件接口
- 装饰器(Decorator):持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
- **具体装饰(ConcreteDecorator)角色:**负责给构件对象“贴上”附加的责任
看上面的定义很抽象,很难懂,直接用案例上代码
业务场景
人,可以穿西装,打领带,穿皮鞋,戴手表,戴帽子等等一些列装饰行为。可以将人作为被修饰则,穿西装,打领带,穿皮鞋,戴手表,戴帽子则为附加的条件
定义一个组件接口
package com.example.spring.boot.test.decorator;
/**
* @Description
* @Author wuhuaming
* @Date 2023/8/17
*/
public interface PeopleComponent {
/**
* 装饰行为
*/
void method();
}
定义一个被修饰则
package com.example.spring.boot.test.decorator.base;
import com.example.spring.boot.test.decorator.PeopleComponent;
/**
* @Description
* @Author wuhuaming
* @Date 2023/8/17
*/
public class People implements PeopleComponent {
@Override
public void method() {
System.out.println("原始装配。。。。。。");
}
}
定义装饰器抽象类
package com.example.spring.boot.test.decorator;
/**
* @Description
* @Author wuhuaming
* @Date 2023/8/17
*/
public abstract class AbstractPeopleDecorator implements PeopleComponent{
private final PeopleComponent peopleComponent;
public AbstractPeopleDecorator(PeopleComponent peopleComponent) {
this.peopleComponent = peopleComponent;
}
@Override
public void method() {
peopleComponent.method();
}
}
组件实现类(穿西装,打领带,穿皮鞋,戴手表,戴帽子)
穿西装
package com.example.spring.boot.test.decorator;
/**
* @Description
* @Author wuhuaming
* @Date 2023/8/17
*/
public class WearSuitPeopleDecorator extends AbstractPeopleDecorator{
public WearSuitPeopleDecorator(PeopleComponent peopleComponent) {
super(peopleComponent);
}
/**
* 添加自己的行为
*/
private void method1(){
System.out.println("穿西装。。。。。。");
}
@Override
public void method() {
// 调用原始的业务逻辑
super.method();
// 新增加的功能
this.method1();
}
}
打领带
package com.example.spring.boot.test.decorator;
/**
* @Description
* @Author wuhuaming
* @Date 2023/8/17
*/
public class TiePeopleDecorator extends AbstractPeopleDecorator{
public TiePeopleDecorator(PeopleComponent peopleComponent) {
super(peopleComponent);
}
private void method1(){
System.out.println("打领带。。。。。。");
}
@Override
public void method() {
super.method();
this.method1();
}
}
穿皮鞋
package com.example.spring.boot.test.decorator;
/**
* @Description
* @Author wuhuaming
* @Date 2023/8/17
*/
public class WearLeatherShoesPeopleDecorator extends AbstractPeopleDecorator{
public WearLeatherShoesPeopleDecorator(PeopleComponent peopleComponent) {
super(peopleComponent);
}
private void method1(){
System.out.println("穿皮鞋......");
}
@Override
public void method() {
super.method();
this.method1();
}
}
戴手表
package com.example.spring.boot.test.decorator;
/**
* @Description
* @Author wuhuaming
* @Date 2023/8/17
*/
public class WearWatchPeopleDecorator extends AbstractPeopleDecorator{
public WearWatchPeopleDecorator(PeopleComponent peopleComponent) {
super(peopleComponent);
}
private void method1(){
System.out.println("戴手表。。。。。。");
}
@Override
public void method() {
super.method();
this.method1();
}
}
戴帽子
package com.example.spring.boot.test.decorator;
/**
* @Description
* @Author wuhuaming
* @Date 2023/8/17
*/
public class WearHatPeopleDecorator extends AbstractPeopleDecorator{
public WearHatPeopleDecorator(PeopleComponent peopleComponent) {
super(peopleComponent);
}
private void method1(){
System.out.println("戴帽子。。。。。。");
}
@Override
public void method() {
super.method();
this.method1();
}
}
测试
package com.example.spring.boot.test.decorator;
import com.example.spring.boot.test.decorator.base.People;
/**
* @Description
* @Author wuhuaming
* @Date 2023/8/17
*/
public class TestDecorator {
public static void main(String[] args) {
// 被修饰则
PeopleComponent component = new People();
component.method();
System.out.println("-------------------------------------------");
// 穿西装
PeopleComponent component1 = new WearSuitPeopleDecorator(component);
component1.method();
System.out.println("-------------------------------------------");
// 打领带
PeopleComponent component2 = new TiePeopleDecorator(component);
component2.method();
System.out.println("-------------------------------------------");
// 穿皮鞋
PeopleComponent component3 = new WearLeatherShoesPeopleDecorator(component);
component3.method();
System.out.println("-------------------------------------------");
// 戴手表
PeopleComponent component4 = new WearWatchPeopleDecorator(component);
component4.method();
System.out.println("-------------------------------------------");
// 戴帽子
PeopleComponent component5 = new WearHatPeopleDecorator(component);
component5.method();
System.out.println("-------------------------------------------");
// 穿西装 + 打领带 + 穿皮鞋
PeopleComponent component6 = new WearLeatherShoesPeopleDecorator(new TiePeopleDecorator(new WearSuitPeopleDecorator(component)));
component6.method();
System.out.println("-------------------------------------------");
// 穿西装 + 打领带 + 穿皮鞋 + 戴手表 + 戴帽子
PeopleComponent component7 = new WearHatPeopleDecorator(new WearWatchPeopleDecorator(component6));
component7.method();
System.out.println("-------------------------------------------");
}
}
测试结果
原始装配。。。。。。
-------------------------------------------
原始装配。。。。。。
穿西装。。。。。。
-------------------------------------------
原始装配。。。。。。
打领带。。。。。。
-------------------------------------------
原始装配。。。。。。
穿皮鞋......
-------------------------------------------
原始装配。。。。。。
戴手表。。。。。。
-------------------------------------------
原始装配。。。。。。
戴帽子。。。。。。
-------------------------------------------
原始装配。。。。。。
穿西装。。。。。。
打领带。。。。。。
穿皮鞋......
-------------------------------------------
原始装配。。。。。。
穿西装。。。。。。
打领带。。。。。。
穿皮鞋......
戴手表。。。。。。
戴帽子。。。。。。
-------------------------------------------