您的位置:首页 > 其它

简单记录一下简单的理解

2015-08-09 16:24 381 查看
装饰模式--- -----》代理模式

        比起策略模式 装饰模式与代理模式更加相似 可以说他的实现方式就有代理的成分在里面,只不过,同样与策略模式一样,站在不同的角度解决问题,虽然无外乎三大特性,但是是灵活多变的,不同场合有不同的意义与效果。

请欣赏UML图(1)^_^



     

      这个重点区别在于装饰类自身对自身的层次代理(抽象装饰类维护一个公共接口的引用,这使得继承与多态的结合实现里氏替换原则),每个装饰类之间没有耦合 在使用时将他们无痛的装入到装饰链中,为目的类按照不同的需求新加不同责任,扩展业务。而且这个业务顺序还是可以控制的。也算是面向切面编程。

 

    其实我认为这种实现的方式就是代理的多层使用,对于client来说,它面向接口,对装饰类的方位就是代理的目的类。与代理不同之处在于,代理主要是针对性的对业务进行代理,对方法进行包裹,面向切面前置后驱,达到对对象的控制访问。

装饰模式更多的灵活的对业务进行控制,使用编写封装好的装饰类,对业务进行灵活控制,而且可以按照需求进行扩展。

 

个人感受最大的区别,就是代理更多的面向被代理类,控制被代理类的访问,装饰更重要的是控制装饰类也就是代理类。

 

再结合代码感受一下:

 

如UML图(2):



Programer接口 Luxilei类实现此接口 原先的职责(功能)定义为skill()是懂点儿基础 ,是入门级程序员。  再看Atguigu抽象类实现此接口,维护一个Programer引用,实现skill()方法实际指向此引用的skill()。此抽象类就是用来对programer进行装饰、进行加强。抽象类下面是具体怎么加强的装饰实现类。比如Feige,重写父类skill()方法,也是执行完programer引用skill()之后,在之后进行新的功能Feige是javase()。Chaoge与Feige类是 就是也增加特有的功能javaweb()。可能后续会有各种需要的具体实现类。。。。。

这样Lxl类不同的时期是需要不同的功能的(或者有Wangxin、Zhangjinqiao其他的Programer实现类),这样就需要对不同的去学习不同的技能,比如Lxli只是入门,然后:

Programer lxl = new Lxl();// 被装饰类

Teacher t1= new Feige();// 飞哥装饰类

Teacher t2 = new Chaoge();// 超哥装饰类

 

t1.setSkill(lxl);// 增加javase skill

t2.setSkill(t1);  // 增加javaweb skill

t2.skill();      // 现在可以快乐的写代码了。。以后还可以学习更多,希望多来些这样美丽心灵的装饰类吧^_^!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息