装饰者模式与代码扩展性的探究

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰者模式与代码扩展性的探究相关的知识,希望对你有一定的参考价值。

  代码的增强优化与扩展,是每个程序员绕不开的坎儿,当然也是我们所追求的理念与信仰,而装饰者模式则是一种很优秀的代码优化理念,

在这里跟大家分享一些自己的学习心得:

-------------------------------------------------------------------------------------------------------------------------------------

  举个简单的例子,

public static void action(animal ann) {
        ann.figeht();
    }

  现在我们想要创建一个action方法,但是我们又不知道这个方法具体由谁来执行,是猫是狗还是我们人,所以在这里我们不讲它写死,

而是向上抽取出一个animal接口

package test;

public interface animal {
    public void figeht();
    public void sleep();
}

这就是一种简单的面向接口的编程思想,这个时候我们将animal接口作为形式参数传入这个方法.但是当我们调用这个方法的时候却不能直接传入animal对象,因为接口是不能实例化的,所以我们要创建一个类来实现animal接口

public class cat implements animal {
    @Override
    public void figeht() {
        System.out.println("猫咪可以打败小蛇");
    }
    @Override
    public void sleep() {
        // TODO Auto-generated method stub
        System.out.println("动物睡觉");
    }

}

 比如现在我们创建类一个cat的类来实现这个接口,这个时候我们就可以这样来调用这个方法

action(new cat()); //猫咪可以打败小蛇

 在这里我们就是传入的一个猫类的对象,当然,我们也可传入狗类,人类等等等等,这样也就大大提升了代码的扩展性,可以满足我们不断变化的需求,这就是多态提高代码扩展性的典型案例;但是现在我们还并不满足于此,我们感觉猫的能力还不够强,我们想要对猫的能力进行加强,该怎么做呢?这里方法有两种

  第一种是继承:继承是java面向对象编程的三大特性之一,相信大家都很熟悉,在这里博主就不再赘述,不过有一点要注意,子类无法继承父类的构造方法,如果父类是走的有参构造,则在创建子类对象的时候需要由子类来完成父类的构造初始化,在我们可以控制父类构造的时候可以采用这种方式,但是当父类太过复杂我们不清楚父类具体构造方法的时候不建议采用这种方式

  而第二种方式就是我们今天的主角,也是博主比较推荐的一种方式---装饰者模式

  我们采用装饰者模式来对类的功能进行增强,首先需要满足两个条件:

    1.与被增强的类实现相同的接口;

    2.被增强类的实例对象通过构造传入修饰类;

  代码如下:

public class superCat implements animal {
    //这里我们通过构造方法先传入一个待加强的类对象
    private cat cat;
    superCat(cat c){
        this.cat = c;
    }
    @Override
    public void figeht() {
        cat.figeht();
        //在这里直接添加我们想要增强的功能
        System.out.println("我是猫鼬,我可以随便虐杀眼镜蛇");
    }
    @Override
    public void sleep() {
        //不需要加强的类只需要通过传入的对象原样调用就可以了,这样我们就既保留了原有的方法,又加强了
        //我们想要加强的方法
        cat.sleep();
    }

}

 这个时候我们再次调用action方法

//现在我们觉得猫咪的战斗力还不够强,我们要对猫咪的战斗力进行加强,在这里我们采用装饰者模式
        action(new superCat(new cat()));

//猫咪可以打败小蛇
//我是猫鼬,我可以随便虐杀眼镜蛇

这个时候我们则会得到增强以后的输出结果,这就是装饰者模式的简单演示

-------------------------------------------------------------------------------------------------------------------------------------------

最后我们再来总结一下两种增强方式的异同:

  继承的方式:知道父类的构造方法式是前提,这种方式子父类产生关系,不符合低耦合,高内聚的编程理念,但是代码实现更加简单

  装饰者模式:首先要满足两个条件: 1.与被增强的类实现相同的接口;2.被增强类的实例对象通过构造传入修饰类;这种方式,类与类之间不产生关系,耦合度低

并且我们不需要知道被增强类对象的具体创建方式,只要获取到被增强类的对象即可,符合低耦合,高内聚的编程理念,但是代码实现相对复杂

--------------------------------------------------------------------------------------------------------------------------------------------

这类偏底层的设计思想,大家可能感觉平时使用的并不多,但是我们可以看到这种设计方式在JAVA的API(比如IO流)和很多第三方jar(C3p0中对connection的增强)包中被广泛使用,所以希望大家可以更多的采用这种代码优化的方法

--------------------------------------------------------------------------------------------------------------------------------------------

 博主觉得,程序的出现就是为了偷懒,博主是一个懒人,所以博主很爱编程;既然是为了偷懒,那我们就要最懒,相同的代码绝对不出现两次,能一劳永逸那就一定一劳永逸,正因为懒所以我们追求代码的极致优化,一起来做一个完美主义的程序员!!!

以上是关于装饰者模式与代码扩展性的探究的主要内容,如果未能解决你的问题,请参考以下文章

装饰者模式

装饰者模式

装饰者模式

设计模式这样玩泰简单(Golang版)-装饰者模式

浅析设计模式3 —— 装饰者模式

装饰者模式——HeadFirst 设计模式学习笔记