Java实现23种设计模式(八):装饰器模式
2020-06-10 本文已影响0人
依然慢节奏
二十三种设计模式分类
设计模式三大分类.jpg一、概述
装饰(Decorator
)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰模式来实现。
优点
- 采用装饰模式扩展对象的功能比采用继承方式更加灵活。
- 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。
缺点
- 多层装饰比较复杂。
- 装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。
场景
1、扩展一个类的功能。
2、动态增加功能,动态撤销。
二、实现
1. 结构图
装饰模式主要包含以下角色:
- 抽象构件(
Component
)角色:定义一个抽象接口以规范准备接收附加责任的对象。 - 具体构件(
Concrete Component
)角色:实现抽象构件,通过装饰角色为其添加一些职责。 - 抽象装饰(
Decorator
)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。 - 具体装饰(
ConcreteDecorator
)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
PS
:UML
结构图可以参考,例子实现并不根据UML
图来完成,灵活实现即可;
2. 实现
- 抽象构件类
package cn.missbe.model.decorator;
/**
* Copyright (c) 2020.
* Email: love1208tt@foxmail.com
* @author lyg 2020/4/27 下午5:33
* description:
**/
public abstract class Shape {
public abstract void draw();
}
- 具体构件类
package cn.missbe.model.decorator;
/**
* Copyright (c) 2020.
* Email: love1208tt@foxmail.com
* @author lyg 2020/4/27 下午5:33
* description:
**/
public class CircleShape extends Shape {
@Override
public void draw() {
System.out.println("Shape:Circle");
}
}
package cn.missbe.model.decorator;
/**
* Copyright (c) 2020.
* Email: love1208tt@foxmail.com
* @author lyg 2020/4/27 下午5:34
* description:
**/
public class RectangleShape extends Shape {
@Override
public void draw() {
System.out.println("Shape:Rectangle");
}
}
- 抽象装饰类
package cn.missbe.model.decorator;
/**
* Copyright (c) 2020.
* Email: love1208tt@foxmail.com
* @author lyg 2020/4/27 下午5:28
* description:
* 装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活
**/
public abstract class AbstractShapeDecorator extends Shape{
/**通过组合来添加装饰,将具体的功能和装饰分隔开*/
protected Shape decoratorShape;
public AbstractShapeDecorator(Shape decoratorShape) {
this.decoratorShape = decoratorShape;
}
@Override
public void draw() {
///具体功能实现
decoratorShape.draw();
}
}
- 具体装饰类
package cn.missbe.model.decorator;
/**
* Copyright (c) 2020.
* Email: love1208tt@foxmail.com
* @author lyg 2020/4/27 下午5:36
* description:
**/
public class CircleShapeDecorator extends AbstractShapeDecorator {
public CircleShapeDecorator(Shape decoratorShape) {
super(decoratorShape);
}
@Override
public void draw() {
setStartLine();
setRedBorder();
super.decoratorShape.draw();
setEndLine();
}
private void setRedBorder(){
System.out.println("Decorator Circle Border:Red");
}
private void setStartLine(){
System.out.println("=============Circle Start==============");
}
private void setEndLine(){
System.out.println("=============Circle End==============");
}
}
package cn.missbe.model.decorator;
/**
* Copyright (c) 2020.
* Email: love1208tt@foxmail.com
* @author lyg 2020/4/27 下午5:39
* description:
**/
public class RectangleShapeDecorator extends AbstractShapeDecorator {
public RectangleShapeDecorator(Shape decoratorShape) {
super(decoratorShape);
}
@Override
public void draw() {
setStartLine();
setRedBorder();
super.decoratorShape.draw();
setEndLine();
}
private void setRedBorder(){
System.out.println("Decorator Rectangle Border:Red");
}
private void setStartLine(){
System.out.println("=============Rectangle Start==============");
}
private void setEndLine(){
System.out.println("=============Rectangle End==============");
}
}
-
Main
主类
package cn.missbe.model.decorator;
/**
* Copyright (c) 2020.
* Email: love1208tt@foxmail.com
* @author lyg 2020/4/27 下午5:39
* description:
* 装饰模式
**/
public class Main {
public static void main(String[] args) {
Shape circle = new CircleShape();
AbstractShapeDecorator redCircle = new CircleShapeDecorator(new CircleShape());
AbstractShapeDecorator redRectangle = new RectangleShapeDecorator(new RectangleShape());
System.out.println("Circle with normal border");
circle.draw();
System.out.println("\nCircle of red border");
redCircle.draw();
System.out.println("\nRectangle of red border");
redRectangle.draw();
}
}