动态地给一个对象增加一些额外的职责。就扩展功能而言,装修模式提供了一种比使用子类更加灵活的替代方案。
装饰模式结构
-
Component(抽象构件角色):定义一个抽象接口以规范准备接收附加责任的对象。
-
ConcreteComponent(具体构件角色):实现抽象构件,通过装饰角色为其添加一些职责(构件本质不变的空间)。
-
Decorator(抽象装饰角色):继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
-
ConcreteDecorator(具体装饰角色):实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
-
类图
自我理解:抽象构件就是一个规范接口,让具体构件来实现,构件就是存放修饰东西的本质,抽象装饰角色实例化构件角色,具体装饰角色是添加新的行为。
装饰模式展示:通过接口实例化对象、对象实例化
装饰模式应用实例
-
实例说明
对不同电脑进行装饰,如操作系统、安装什么浏览器......
-
实例分析
抽象构件为Computer,具体构件分为DesktopComputer、NotebookComputer,抽象装饰为ComputerDecorator,具体装饰为DesktopWindws......(下面展示仅此一个装饰类)
-
实例类图
-
实例代码
抽象构件Computer
public interface Computer {
public void computerType();
}
具体构建DesktopComputer、NotebookComputer
public class DesktopComputer implements Computer{
@Override
public void computerType() {
// TODO Auto-generated method stub
System.out.println("this is desktop computer");
}
}
public class NotebookComputer implements Computer{
@Override
public void computerType() {
// TODO Auto-generated method stub
System.out.println("this is notebook computer");
}
}
抽象装饰ComputerDecorator
public class ComputerDecorator implements Computer{
private Computer computer;
public ComputerDecorator(Computer computer){
this.computer=computer;
}
@Override
public void computerType() {
// TODO Auto-generated method stub
computer.computerType();
}
}
具体装饰DesktopWindows
public class DesktopWindows extends ComputerDecorator{
public DesktopWindows(Computer computer) {
super(computer);
// TODO Auto-generated constructor stub
}
public void computerType(){
this.addWindows();
super.computerType();
}
public void addWindows(){
System.out.println("computer is installed windows");
}
}
Client类
public class Client {
public static void main(String[] args) {
//全透明 使用父类实例化子类
Computer computer,desktopComputer;
computer=new DesktopComputer();
desktopComputer=new DesktopWindows(computer);
desktopComputer.computerType();
System.out.println("----------");
//半透明 子类自己实例化
Computer computer_o=new DesktopComputer();
computer_o.computerType();
DesktopWindows desktopWindows=new DesktopWindows(computer_o);
desktopWindows.addWindows();
}
}
效果
computer is installed windows
this is desktop computer
----------
this is desktop computer
computer is installed windows
装饰模式优缺点与适用环境
-
优点:对一个对象进行功能扩充及多次装饰,抽象装饰类与抽象构件是关联关系,比继承灵活,符合开闭原则。
-
缺点:装饰模式进行系统设计时将产生很多小对象,会占用系统资源,装饰模式更容易出错,出错后需要逐一排查。
-
使用环境:不影响其他对象的情况下以透明的方式给单个对象添加职责,系统不采用继承的方式进行扩展。