装饰模式:就是动态的对类的功能的增强或者是扩展。
下面是以一个实例来理解该模式。
现在要设计一个界面组件库,其中包含的组件有窗体(window)、文本框(TextField)、列表(List),
现在要为文本框添加黑色边框,为列表添加滚动条,但这种组合并不是固定的有的时候窗体也要添加滚动条,列表需要添加黑色边框和滚动条等各种组合形式。为了灵活的、动态的实现这些需求的话就需要用到装饰模式。
抽象构件:(component)是对具体被装饰的类和装饰类的抽象。
被装饰的类:window、textfield、list
抽象的装饰类:继承了抽象构件,并定义了抽象类的共同特性(Decorator)
具体的装饰类:实现了抽象的装饰类,并定义了自己的业务方法,以便对装饰类进行扩展。(ScrollBarDecorator(滚动条)、BlackBorderDecorator(黑色边框))
下面是相关实现:
抽像构件:component
public interface Component
{
public void display();//装饰类的业务方法最好与被装饰类的方法保持一致
}
被装饰的类:
Window.java
//被装饰的类1
public class Window implements Component{
public void display() {
System.out.println("****显示窗体****");
}
}
Textfield.java
//被装饰的类2
public class TextField implements Component{
public void display() {
System.out.println("****显示文本框****");
}
}
List.java
//被装饰的类3
public class List implements Component{
public void display() {
System.out.println("****显示列表****");
}
}
抽象的装饰类:
Decorator.java
public abstract class Decorator implements Component{
protected Component component;
public Decorator(Component component){
this.component = component;
}
public abstract void display();
}
具体的装饰类:
ScrollBarDecorator.java
public class ScrollBarDecorator extends Decorator{
public ScrollBarDecorator(Component component) {
super(component);
}
public void display() {
component.display();
this.addScrollBar();
}
public void addScrollBar()//需要添加的功能,在此他是独立于其他类的
{
System.out.println("----显示滚动条----");
}
}
BlackBorderDecorator.java
public class BlackBorderDecorator extends Decorator{
public BlackBorderDecorator(Component component) {
super(component);
}
public void display() {
component.display();
this.addBlackBorder();
}
public void addBlackBorder()//需要添加的功能,在此他是独立于其他类的
{
System.out.println("----显示黑色边框----");
}
}
客户端:
public class Client
{
public static void main(String[] args) {
Component window = new Window();
/**
* 可以对被修饰的类进行多重修饰
*/
Component component =
new ScrollBarDecorator(new BlackBorderDecorator(window));
component.display();
}
}
结果:
****显示窗体****
----显示黑色边框----
----显示滚动条----
通过装饰模式我理解了动态组合的重要性,他能够动态的实现对象与对象之间的组合,可以减少类的定义。同时该模式是针对抽象编程,利于在不改变源代码的情况下实现系统的扩展。