定义

Decorator Pattern: 动态地给一个对象增加一些额外地职责,就增加对象功能来说,装饰模式比生成子类实现更灵活。装饰模式是一种对象结构型模式。


UML示例

装饰模式


代码示例

// 抽象构件类
abstract class Component {
    public abstract void display();
}
// 窗体类 具体构件类
public class Window extends Component{
    public void display() {
        System.out.println("显示窗体");
    }
}

// 文本框类:具体构件类
public class TextBox extends Component{
    public void display() {
        System.out.println("显示文本框");
    }
}

// 列表框类 具体构件
public class ListBox extends Component{
    public void display() {
        System.out.println("显示列表框");
    }
}
// 构件装饰类 抽象装饰类
public class ComponentDecorator extends Component{
    private Component component;

    public ComponentDecorator(Component component){
        this.component = component;
    }

    public void display(){
        component.display();
    }
}
// 滚动条装饰类 具体装饰类
public class ScrollBarDecorator extends ComponentDecorator{

    public ScrollBarDecorator(Component component) {
        super(component);
    }

    public void display() {
        super.display();
        setScrollBar();
    }

    public void setScrollBar(){
        System.out.println("为构件添加滚动条");
    }
}
// 黑色边框装饰类
public class BlackBorderDecorator extends ComponentDecorator{
    public BlackBorderDecorator(Component component) {
        super(component);
    }

    public void display() {
        super.display();
        setBlackBorder();
    }

    public void setBlackBorder(){
        System.out.println("为构件添加黑色边框");
    }
}
public class Client {
    public static void main(String[] args) {
        // 添加抽象构件定义
        Component component, componentSB, comSBB;
        // 定义具体构件
        component = new Window();

        componentSB = new ScrollBarDecorator(component);

        componentSB.display();

        // 装饰类不仅可以注入具体构件类
        // 装饰类还可以注入具体装饰类获得拓展!
        // 这是它与桥接模式不同地方之一
        comSBB  = new BlackBorderDecorator(componentSB);
        comSBB.display();
    }
}

客户端输出

显示窗体
为构件添加滚动条
显示窗体
为构件添加滚动条
为构件添加黑色边框
最后修改:2020 年 05 月 24 日
如果觉得我的文章对你有用,请随意赞赏