精华内容
下载资源
问答
  • 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的的一个包装。 这种模式创建了一个装饰,用来包装原有的,并在...

    装饰模式

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
    这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
    装饰的顺序会影响代码的运行效果,如人穿衣服一样,最后装饰的内容会出现在最外层


    介绍
    意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
    主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。
    何时使用:在不想增加很多子类的情况下扩展类。
    如何解决:将具体功能职责划分,同时继承装饰者模式。
    关键代码: 1、Component 类充当抽象角色,不应该具体实现。 2、修饰类引用和继承 Component 类,具体扩展类重写父类方法。
    应用实例: 1、孙悟空有 72 变,当他变成”庙宇”后,他的根本还是一只猴子,但是他又有了庙宇的功能。 2、不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。
    优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
    缺点:多层装饰比较复杂。
    使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。
    注意事项:可代替继承。


    装饰模式为已有类动态附加额外的功能就像LOL、王者荣耀等类Dota游戏中,英雄升级一样。每次英雄升级都会附加一个额外技能点学习技能。具体的英雄就是ConcreteComponent,技能栏就是装饰器Decorator,每个技能就是ConcreteDecorator;

    //Component 英雄接口 
    public interface Hero {
        //学习技能
        void learnSkills();
    }
    //ConcreteComponent 具体英雄盲僧
    public class BlindMonk implements Hero {
    
        private String name;
    
        public BlindMonk(String name) {
            this.name = name;
        }
    
        @Override
        public void learnSkills() {
            System.out.println(name + "学习了以上技能!");
        }
    }
    //Decorator 技能栏
    public class Skills implements Hero{
    
        //持有一个英雄对象接口
        private Hero hero;
    
        public Skills(Hero hero) {
            this.hero = hero;
        }
    
        @Override
        public void learnSkills() {
            if(hero != null)
                hero.learnSkills();
        }    
    }
    //ConreteDecorator 技能:Q
    public class Skill_Q extends Skills{
    
        private String skillName;
    
        public Skill_Q(Hero hero,String skillName) {
            super(hero);
            this.skillName = skillName;
        }
    
        @Override
        public void learnSkills() {
            System.out.println("学习了技能Q:" +skillName);
            super.learnSkills();
        }
    }
    //ConreteDecorator 技能:W
    public class Skill_W extends Skills{
    
        private String skillName;
    
        public Skill_W(Hero hero,String skillName) {
            super(hero);
            this.skillName = skillName;
        }
    
        @Override
        public void learnSkills() {
            System.out.println("学习了技能W:" + skillName);
            super.learnSkills();
        }
    }
    //ConreteDecorator 技能:E
    public class Skill_E extends Skills{
    
        private String skillName;
    
        public Skill_E(Hero hero,String skillName) {
            super(hero);
            this.skillName = skillName;
        }
    
        @Override
        public void learnSkills() {
            System.out.println("学习了技能E:"+skillName);
            super.learnSkills();
        }
    }
    //ConreteDecorator 技能:R
    public class Skill_R extends Skills{    
    
        private String skillName;
    
        public Skill_R(Hero hero,String skillName) {
            super(hero);
            this.skillName = skillName;
        }
    
        @Override
        public void learnSkills() {
            System.out.println("学习了技能R:" +skillName );
            super.learnSkills();
        }
    }
    //客户端:召唤师
    public class Player {
        public static void main(String[] args) {
            //选择英雄
            Hero hero = new BlindMonk("李青");
    
            Skills skills = new Skills(hero);
            Skills r = new Skill_R(skills,"猛龙摆尾");
            Skills e = new Skill_E(r,"天雷破/摧筋断骨");
            Skills w = new Skill_W(e,"金钟罩/铁布衫");
            Skills q = new Skill_Q(w,"天音波/回音击");
            //学习技能
            q.learnSkills();
        }
    }

    输出

    学习了技能Q:天音波/回音击
    学习了技能W:金钟罩/铁布衫
    学习了技能E:天雷破/摧筋断骨
    学习了技能R:猛龙摆尾
    李青学习了以上技能!

    参考
    装饰器模式

    展开全文
  • 在栈中,一端是封闭的,既不允许进行插入元素,也不允许删除元素;另一端是开口的,允许插入和删除元素。通常称插入、删除的这一端为栈顶,另一端为栈底。当表中没有元素时称为空栈。栈顶元素总是最后被插入的元素,...
  • Python核心编程第

    热门讨论 2009-07-30 17:07:20
     7.5.1 不允许一个键对应多个值   7.5.2 键必须是可哈希的   7.6 集合类型   7.6.1 如何创建集合类型和给集合赋值   7.6.2 如何访问集合中的值   7.6.3 如何更新集合   7.6.4 如何删除集合中的...
  • Python核心编程第版(中文)

    热门讨论 2015-04-23 16:40:13
    7.5.1 不允许一个键对应多个值 7.5.2 键必须是可哈希的 7.6 集合类型 7.6.1 如何创建集合类型和给集合赋值 7.6.2 如何访问集合中的值 7.6.3 如何更新集合 7.6.4 如何删除集合中的成员和集合 7.7 集合类型...
  • 真正的0地址内存区储存的是计算机系统中最重要的“中断描述符表”,绝对不允许应用程序使用。在没有保护机制的操作系统下(如DOS),写数据到这个地址会导致立即当机,而在健壮的操作系统中,如Windows等,这个操作会...
  • Python核心编程(中文第版)

    热门讨论 2009-10-02 12:08:14
     7.5.1 不允许一个键对应多个值   7.5.2 键必须是可哈希的   7.6 集合类型   7.6.1 如何创建集合类型和给集合赋值   7.6.2 如何访问集合中的值   7.6.3 如何更新集合   7.6.4 如何删除集合中的...
  • 许多客户都要求使用维数据矩阵代码,而...例如,如果不允许使用外包装上的EAN代码对生产设备进行识别和控制(原因是这代码会导致客户的商品管理系统出现问题),那么使用矩阵式二维码代替一维条形码将会更为方便。
  • 一、在工作中我时常会遇到这样一些问题: ...这文件不允许出现在网络上。 然后创建一个office文件,这个是用于办公的文件。例如。。。 然后创建一个tools文件夹,这里放着所有的办公娱乐软件。例

    一、在工作中我时常会遇到这样一些问题:

    1. 保存的文件用到的时候找不到了
    2. 安装一个软件到处都是插件
    3. 办公文档存放特别混乱

    二、这些问题都已可以用文件分类来解决,文件分类要从重创建文件夹开始。

    首先我们要避开C盘(mac电脑不用考虑),然后我们创建一个个人文件夹,这里专门放着一些私有文件。这类文件不允许出现在网络上。

    然后创建一个office文件,这个是用于办公的文件。例如was和office全套

    然后创建一个tools文件夹,这里放着所有的办公娱乐软件。例如微信,qq,xmind,几乎若有安装类型的软件都放在这里

    然后创建一个zipSoftware文件夹,这里放的是解压软件,例如tomcat,一些破解版软件等

    然后就是音乐、电影、电子书(**图书馆)文件夹。这里放着的是娱乐文件。

    还有根据个人喜好创建文件夹,关键是能快速找到才行

    三、当然这些属于一级目录,如果他的下面文件多的话还可以进行二级分类三级分类,不过一般不建议超过三级目录,那样不便于查找。当目录比较深时,建议创建文件索引。

    比如在根目录下创建一个文本文件,这里面记载着每个软件,每个电影,每个项目的具体位置。这样你寻找文件时就能快速定位到他的位置了。

    四、环境变量的保存:前面之所以文件名使用英文,是为了开发中会装一些开发环境,这些环境需要配置环境变量,这时你就会发现所以的环境都在你的眼前,手到擒来。

    五、借助工具:

            常言道:君子生非异也,善假与物也!我们要善于借助工具。在网上有很多这样的工具,这里我只推荐一种:listary(win)自行百度吧。当然,利用工具的同时将文件有条不紊的进行分类也是十分重要的。

    六、最后:

        不管是工作还是学习,善于总结、善于使用方法。会达到事半功倍的效果。加油吧后浪。

     

     

     

    展开全文
  • 最终状态:最终状态就是支付订单的最后状态,是不允许在修改了的。 我们是直连的工行,出现了这样一个现象,一个支付订单,回调了两次,第一次是失败提示说用户的账户余额不足,过了有9分钟,第次通知说支付成功了...

    支付订单状态一般情况下分为三大类,待支付,处理中,最终状态(成功或失败)。

    1. 待支付:支付订单初始化创建
    2. 处理中:已经组装好支付数据或已经发送至支付机构,还未返回结果
    3. 最终状态:最终状态就是支付订单的最后状态,是不允许在修改了的。

    我们是直连的工行,出现了这样一个现象,一个支付订单,回调了两次,第一次是失败提示说用户的账户余额不足,过了有9分钟,第二次通知说支付成功了。
    场景分析:用户第一次支付,发现钱不够,页面没有关,换了一张卡,或者转了足够的钱,继续支付

    当第一次通知时,支付状态就已经被设置为支付失败了,第二次通知时,发现已经是最终状态就不在处理了。结果就是客户前被扣了,订单也没有成功。

    我提出解决方案,是把他的失败,映射成处理中,只有得到明确的结果说成功了,才修改成成功,这样就不会影响到对账等后续操作,因为对账只对成功的。

    展开全文
  • 不允许出现任何魔法值(即未经预先定义的常量)直接出现在代码中。 B .魔法值是指程序中随意定义并赋值的变量值,如果代码编写者明白变量值意义是可以任意使用的,例如在代码中写if(status == 3) return error;...
  • HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary...
  • 尹成JAVA快速入门

    2020-12-08 15:12:43
    如果说Java还有一个链接阶段,它只是把新类装进环境的过程,它是增量式的、轻量级的过程。因此,Java支持快速原型和容易试验,它将导致快速程序开发。这是一个与传统的、耗时的“编译、链接和测试”形成鲜明对比的...
  • java 面试题 总结

    2009-09-16 08:45:34
    HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary...
  • 超旺软件最新单机版

    2019-04-13 01:06:33
    开账之后不允许再修改期初建帐,若已开账,但还没有录入业务单据的情况下可以通过反开帐来修改期初。进入《系统管理》—开帐,点反开帐按钮即可。 第三章 进货管理 超旺软件进货管理的操作说明。 3.1 进货开单 ...
  • eas供应链dep案例集

    2017-11-18 22:32:39
    DEP大 DEP方案编码 DEP方案中文名称 业务场景 简要实现方案 参考开发工作量(人/天) 新增及调整字段 EASSCMA1P0001 采购入库单增加项目字段 希望能实现项目采购,需要在采购入库单中加入项目字段,调用辅助资料...
  • 声明方法的存在而去实现它的被叫做抽象(abstract class),它用于要创建一个体现某些基本行为的,并为该声明方法,但能在该中实现该的情况。能创建abstract 的实例。然而可以创建一个变量,其...
  • 在用光盘安装系统时就需要对此部分进设置,第一驱动改为光驱引导(First Boot Device),否则光驱不会引导系统。 Quick Power On Self Test(快速启动选择): 当设定为[Enabled](启动)时,这个项目在系统...
  • 10,GHOST运行之前自动删除auto病毒引导文件,避免返回WIN后被病毒次感染. 11,界面友好,全中文操作,无需英语和计算机专业知识. 12,危险操作之前贴心提示,明明白白放心使用. 13,附带GHOST浏览器,能打开GHO映像,任意...
  • c#学习笔记.txt

    热门讨论 2008-12-15 14:01:21
    一个结构能从另一个结构或继承,而且能作为一个的基。但是,结构从基类 Object 继承。结构可实现接口,其方式同类完全一样。 [c ] 与 C 不同,无法使用 struct 关键字声明。在 C# 中,与结构在语义上是...
  • 不能访问主要是由于XP默认不开启guest,而且即使开了guest,XP默认是不允许guest从网络访问计算机的。还有就是那个值得注意的问题。相信一些不考虑安全的地方或是电脑公司给人做系统密码都是空的,但这样是不允许...
  • 软件测试规范

    2018-04-23 09:16:12
    1.等价划分 .......................................................................................................................................... 7 2.因果图 ........................................
  • 注塑成型技术

    2012-05-02 10:48:54
    预烘干 在80℃温度下烘干4h,除了直接从料容器内喂料;尼龙有吸水性,应该保存在防潮容器内和封闭的料斗内;水含量超过0.25%就会造成成型改变 回收率 可加入10%回料 收缩率 0.7%~2.0%;或者加了30%的玻璃...
  • c# 加密和解密相关代码

    热门讨论 2011-09-06 11:04:59
    对比两个进制的值,从右向左按位对比,如果两个进制数的相应位都为1 或两个 进制数的相应位都为0,则返回0;如果两个进制数的相应位中一个为1 一个为0,则返回1,最后得到的结 果为进制值11000,该值转换...
  • 注意:线程池的创建不允许使用 Executors 去创建,而是通过ThreadPoolExecutor的方式去创建,这样的处理方式可以规避资源耗尽的风险。 详情移步至:...
  • Excel百宝箱8.0

    2011-06-07 21:32:17
    【禁止重复值】:可以指定某列不允许重复,指定后该列输入重复值时会自动提示 【标示重复值】:将重复出现的数据用不同颜色分别标示出来,不同重复值用不同颜色 【删除空白单元格所在行】:输入1则删除空白行(整行...
  • 3一般单反相机在显示屏模式下按下快门时,快门不是马上释放,而是要有一个1秒钟左右的间隔,如果拍摄移动物体,这个世界可能被摄体已经在预先构图中预计出现的位置了。 当然,微单用的是电子取景器,这个是...
  • 图书管理系统毕业设计+源码-java

    千次下载 热门讨论 2012-05-06 13:45:09
    Visual j++6.0介绍Java的Windows基础(WFC),这个新的应用程序框架访问Microsoft Windows API,允许用户用Java编成语言编写全特性的Winndows应用程序。WFC 也包装在Internet Explorer 4.0中执行的动态HTML对象...
  • LEGEND for HGE.zip

    2019-10-19 07:06:29
    素材关闭按钮请严格按照演示素材的按钮位置制作,否则会出现错位找到地方关闭。 脚本实例: ;========================================== [@MAIN] #if #act SETBIGDIALOGBOX 0 ;===============================...
  • 德力西产品说明.pdf

    2019-10-10 18:41:58
     只能在好面板后才能接通输入电源,通电时不要卸去外盖。 5. 切勿触摸变频器内的高压端子。 6. 电路通电时不要连接或断开导线及连接器。 7. CMOS元件容易被静电损坏,请不要触碰...
  • EXCEL集成工具箱V6.0

    2010-09-11 01:44:37
    【隔行插入】 在当前工作表中允许从M行到N行,隔X行插入Y行,并允许是否需复制标题Z行。 【制作工资条】 瞬间将工资明细表生成工资条,方便打印并裁剪。可以自己定义工资条标题的行数以及相隔行数、插入行数等。并...

空空如也

空空如也

1 2 3 4
收藏数 62
精华内容 24
关键字:

不允许出现二类装