设计模式——装饰模式


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值