zoukankan      html  css  js  c++  java
  • 装饰模式实战

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

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

  • 相关阅读:
    并行编程——OPENMP
    并行编程——MPI/OPENMP混合编程
    C#中窗体间传递数据的几种方法
    开发人员一定要加入收藏夹的网站
    Web网站中从Sybase数据库读取的中文显示为乱码的解决方法
    数据空间和日志空间分离的操作方法
    双机集群中的数据库配置同步
    删除已损坏库方法
    RDLC报表中如何实现行交替颜色
    安装Sybase时安装界面为乱码的解决方法
  • 原文地址:https://www.cnblogs.com/mengyan/p/2674226.html
Copyright © 2011-2022 走看看