设计模式——装饰模式

来源:互联网 发布:三角衣柜淘宝店铺质量 编辑:程序博客网 时间:2024/05/21 14:52

Author:云都小生


概述



一个GUI(图形化)程序,有很多的控件组成,例如说文本框、按钮、选择菜单等等,而这些文本框、按钮、选择菜单又会有很多种风格。我们一般会怎么去设计文本框、按钮、选择菜单与它们“风格”“装饰”的架构。

emmm···· 应该是这样···

这里写图片描述

这种用继承来架构的解决方案,可扩展性差,例如说我想要增加一个其他的特效,那每个控件下都得增加一个类,并且得修改一个类。除此之外,还有许多重复的代码,效率很低。

那怎么办呢?

我在学习GUI程序设计的时候,如果想要在一个原始的窗口中添加什么东西的控件的时候,通常都是add(控件)的方式。控件与原始窗口的关系是组合 36
+ 关系,通过add(控件)的方式添加到窗口中。

还记不记得有一个面向对象的设计原则——多用组合,少用继承,继承会增加程序的耦合程度。


了解装饰模式



在现实生活中,我们可以给我们的汽车、房子进行装饰,增加新的东西。装饰模式是一种对象结构型模式,它的用途一般是用来扩展系统功能。

在装饰模式中有以下角色:

抽象构件:抽象构件是具体构件和抽象修饰类的共同父类。具体构件例如按钮、文本框这些,而修饰类可以是透明边框、高亮边框等,而抽象修饰类是它们的共同父类。

不要问我为什么要弄一个抽象修饰类,问了的话自动滚去刷Java面向对象。

具体构件:它们是抽象构件的子类,定义了具体的构件对象,例如说按钮、文本框。

抽象装饰类:它也是抽象构建的子类,用于给具体构建添加职责。它内部会维护一个指向抽象构件对象的引用,可以用来调用构建对象的方法。

具体装饰类:是抽象装饰类的子类,负责向构件添加新的职责。并且,它还定义了一些新的方法。

这里写图片描述

代码示范


//抽象构件abstract class Component {    public abstract void display();}//具体构件:按钮public class Button extends Component{    public void display() {        System.out.println("显示按钮");    }}//具体构件:标签public class Label {    public void display() {        System.out.println("显示标签");    }}//具体构件:文本框public class TextBox 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 InvisibleBorder extends ComponentDecorator{    public InvisibleBorder(Component component)    {        super(component);    }    private void setBorder()    {        System.out.println("设置了透明边框");    }}//具体装饰类:高亮边框public class HighlightBorder extends ComponentDecorator{    public HighlightBorder(Component component)    {        super(component);    }    private void setBorder()    {        System.out.println("设置了高亮边框");    }}

2017/12/4 1:30:52 @Author:云都小生