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:云都小生