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

  • 相关阅读:
    搜书网站
    在Ubuntu 18.04上安装Git
    git 解决每次更新代码都要输入用户名密码
    《程序员修炼之道》笔记(四)
    《程序员修炼之道》笔记(三)
    《程序员修炼之道》笔记(二)
    《程序员修炼之道》笔记(一)
    学习MVC之租房网站(六)-用户登录和权限控制
    学习MVC之租房网站(五)-权限、角色、用户管理
    [翻译] 如何更好地编写单元测试(下)
  • 原文地址:https://www.cnblogs.com/mengyan/p/2674226.html
Copyright © 2011-2022 走看看