设计模式(8)装饰模式
先声明此文章是个人学习《大话设计模式》这本书个人学习积累之用....非个人原创...
因其公司最近统一工装,需要我们自己去配置服装,这里面分得了很多学问,在我们平常的时候,我们不妨走点嘻哈路线,像:大T恤、跨库、破球鞋、这要求我们平常的时候穿,但是我们在上班的时候我们就需要换一种装饰了,像:黑西装、黑领带、黑皮鞋.......说到此、在我们平常生活中,比如腾讯的QQ装扮、网络游戏装扮、都需要我们来设计角色的着装问题,好咱现就第一种装扮用程序来实现:
这样我们实现了用户自己选择服装的功能,当我们上班的时候我们就可以选择第二种正装来实现共能,在下班后我们就可以用第一种软件来实现,但是问题又出来了,夏天到了我们的服装还能只有穿这几套衣服嘛?那岂不是会很惨,我们需要增加"超人"的装扮,那我们该怎样去处理呢?
如果我们在类中增加相应的衣服,这样的话我们这个类会变得越来越庞大,很显然这不是我们想要的。而且违背了设计模式中的"开放——封闭原则"
该怎样来实现呢?咱来重新更改相应的代码:
这样我们在增加新的装扮的时候、只需要添加新的子类就可以了,里面用到了继承,用了抽象类更好的实现了面向对象。已经实现了服饰类和人类的分离,但这样我们就不存在问题了嘛。
但是在客户端我们在选择装饰的时候,需要实例化相应的穿着,这就好比我们光着身子,当着大家的面,先穿上身的衣服,然后载穿下身,穿鞋,这样的穿衣方式你觉得合适嘛,为了避免这个问题的出现我们应该采用内部组装完毕,然后显示出来,是不是觉得有点像建造者模式,但是建造者模式要求建造的过程必须是稳定的,而我们穿衣这个建造过程是不稳定的,比如我们完全可以内穿西装,外穿T恤,再加披风,打上领带,皮鞋外穿然后再穿上破球鞋,也可以只穿条裤衩就算完成,换句话就是说,通过服饰组合出一个有个性的人完全可以有无数种方案,并非是固定的、顺序也是有讲究的比如内裤后穿外裤,这叫凡人,内裤外穿到外面,这就是超人了,我们需要把所需的共能按正确的顺序串联起来进行控制,这样貌似很难做到,嘿嘿,该装饰模式出厂了:
装饰模式:动态的给一个对象添加一些额外的职责,就增加共能来说,装饰模式比生成子类更为灵活
Component是定义了一个对象接口,可以给这些对象动态的添加职责。ConcreteConmponent是定义了一个具体的对象,也可以给这个对象添加一些职,Decorator,装饰抽象类,继承Component,从外类扩展Componet类的共能,但对于Componet类来说,是无需知道Decortator的存在的,至于ConcreteDecorator就是具体的装饰对象,起到给component添加职责的共能。
看看具体的实现代码:
原来装饰模式是利用setComponent来对对象进行包装的,这样每个装饰对象实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何添加到对象链当中,用刚才的例子来说就是,我们完全可以先穿外裤、再穿内裤,而不一定要先内后外。