• 装饰模式实战


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

    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~~

  • 相关阅读:
    【记录】【MySQL】填充字符串函数 LPAD(str,len,padstr)
    nvm安装node和npm,个人踩坑记录
    win10系统下cmd输入一下安装的软件命令提示拒绝访问解决办法
    bootstrap大图轮播手机端不能手指滑动解决办法
    JS中函数声明与函数表达式的异同
    javaScript实现归并排序
    js插入节点appendChild和insertBefore
    JS的事件冒泡和事件捕获
    js 停止事件冒泡 阻止浏览器的默认行为
    事件绑定的几种常见方式
  • 原文地址:https://www.cnblogs.com/mengyan/p/2674226.html
Copyright © 2020-2023  润新知