装饰模式实战

最近在读以前师兄写的程序,发现有很多设计模式的思想值得我去借鉴,我本来就对于模式与架构比较痴迷(虽然水平暂时比较低),发现了“美丽”的代码后当然是不会放过的,现在将其写出以飨读者~~

1.应用场景

在java应用程序编程中,当点击某个可视组件时(例如MenuItem),会触发其相应的注册监听器(ActionListener),执行监听器中的功能(回调actionPerformed()函数)。

现在希望在执行监听器功能的过程中,将鼠标呈现漏斗话,表示用户现在比较忙。(这是一个常用的功能实现);

我们有一个MenuItem类型的 item,ActionListener 类型的originalListener,一个Component类型的comp;其中originalListener中封装着点击item后的相应相应操作。现在我们想为其加入一个“设置鼠标为漏斗”的功能,当点击item后出发originalListener,当originalListener的actionPerformed函数执行中,设置comp上的鼠标为漏斗,执行完毕后恢复正常。

2.解决方案

(1)在originalListener中直接插入设置鼠标形状的代码:

actionProformed(ActionEvent e)
{
        comp.设置鼠标
         ........................ //业务逻辑
      comp.还原鼠标
}

首先这样破坏了面向对象的编程规则:开-闭原则,面对修改应该是闭合的!

其次,这增加了originalListener与comp的耦合(本来它们两个是没有关系的)

(2)仔细分析案例,其实就是为一个类增加额外的功能,我们应该想到装饰模式;但是装饰模式中需要继承,还是免不了要进行耦合,所以这里使用 装饰模式+组合的方式进行调整,设置了一个类中的方法:

public static ActionListener createListener(final Component component,
            final ActionListener mainActionListener)
    {
        ActionListener actionListener = new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                try
                {
                    component.setCursor(busyCursor);
                    mainActionListener.actionPerformed(ae);
                } finally
                {
                    component.setCursor(defaultCursor);
                }
            }
        };
        return actionListener;
    }

这个类的精妙之处在于:
首先,利用装饰模式解决了更改原类的要求;

其次,利用组合的方式将comp注入到监听器中,避免的方法注入的耦合;

最后,让你想不到是利用匿名类达到内部类的效果竟然实现了   闭包 的功能!!!
最后不得不感叹一句,湿兄好牛x~~

原文地址:https://www.cnblogs.com/mengyan/p/2674226.html