“Github:https://github.com/nateshao/design-demo/tree/main/JavaDesignPatterns/12-decorator
现实生活中的“装饰”实例
装饰模式分析
定义
“装饰模式:动态地给一个对象增加一些额外的职责。就扩展功能而言,装饰模式提供了一种比使用子类更加灵活的替代方案。
对象结构型模式
装饰模式的结构
装饰模式包含以下4个角色:
Component
(抽象构件)ConcreteComponent
(具体构件)Decorator
(抽象装饰类)ConcreteDecorator
(具体装饰类)抽象构件类典型代码:
public abstract class Component {
public abstract void operation();
}
具体构件类典型代码:
public class ConcreteComponent extends Component {
public void operation() {
//实现基本功能
}
}
抽象装饰类典型代码:
public class Decorator extends Component {
private Component component; //维持一个对抽象构件对象的引用
//注入一个抽象构件类型的对象
public Decorator(Component component) {
this.component=component;
}
public void operation() {
component.operation(); //调用原有业务方法
}
}
具体装饰类典型代码:
public class ConcreteDecorator extends Decorator {
public ConcreteDecorator(Component component) {
super(component);
}
public void operation() {
super.operation(); //调用原有业务方法
addedBehavior(); //调用新增业务方法
}
//新增业务方法
public void addedBehavior() {
……
}
}
实例说明:
“某软件公司基于面向对象技术开发了一套图形界面构件库——VisualComponent,该构件库提供了大量基本构件,如窗体、文本框、列表框等,由于在使用该构件库时,用户经常要求定制一些特殊的显示效果,如带滚动条的窗体、带黑色边框的文本框、既带滚动条又带黑色边框的列表框等等,因此经常需要对该构件库进行扩展以增强其功能。 现使用装饰模式来设计该图形界面构件库。
实例类图
图形界面构件库结构图
实例代码
Component
:抽象界面构件类,充当抽象构件类Window
:窗体类,充当具体构件类TextBox
:文本框类,充当具体构件类ListBox
:列表框类,充当具体构件类ComponentDecorator
:构件装饰类,充当抽象装饰类ScrollBarDecorator
:滚动条装饰类,充当具体装饰类BlackBorderDecorator
:黑色边框装饰类,充当具体装饰类Client
:客户端测试类Component.java
public abstract class Component {
public abstract void display();
}
Window.java
public class Window extends Component {
public void display() {
System.out.println("显示窗体!");
}
}
TextBox.java
public class TextBox extends Component {
public void display() {
System.out.println("显示文本框!");
}
}
ListBox.java
public class ListBox extends Component {
public void display() {
System.out.println("显示列表框!");
}
}
ComponentDecorator.java
public class ComponentDecorator extends Component {
private Component component; //维持对抽象构件类型对象的引用
//注入抽象构件类型的对象
public ComponentDecorator(Component component) {
this.component = component;
}
public void display() {
component.display();
}
}
ScrollBarDecorator.java
public class ScrollBarDecorator extends ComponentDecorator {
public ScrollBarDecorator(Component component) {
super(component);
}
public void display() {
this.setScrollBar();
super.display();
}
public void setScrollBar() {
System.out.println("为构件增加滚动条!");
}
}
BlackBorderDecorator.java
public class BlackBorderDecorator extends ComponentDecorator {
public BlackBorderDecorator(Component component) {
super(component);
}
public void display() {
this.setBlackBorder();
super.display();
}
public void setBlackBorder() {
System.out.println("为构件增加黑色边框!");
}
}
Client.java
public class Client {
public static void main(String args[]) {
Component component, componentSB, componentBB;
component = new Window();
componentSB = new ScrollBarDecorator(component);
componentBB = new BlackBorderDecorator(componentSB);
componentBB.display();
}
}
为构件增加黑色边框!
为构件增加滚动条!
显示窗体!
透明装饰模式
……
Component component_o,component_d1,component_d2; //全部使用抽象构件定义
component_o = new ConcreteComponent();
component_d1 = new ConcreteDecorator1(component_o);
component_d2 = new ConcreteDecorator2(component_d1);
component_d2.operation();
//无法单独调用component_d2的addedBehavior()方法
……
半透明装饰模式
……
Component component_o; //使用抽象构件类型定义
component_o = new ConcreteComponent();
component_o.operation();
ConcreteDecorator component_d; //使用具体装饰类型定义
component_d = new ConcreteDecorator(component_o);
component_d.operation();
component_d.addedBehavior(); //单独调用新增业务方法
……
模式优点
模式缺点
模式适用环境