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

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

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

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

  举个简单的例子,

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的增强)包中被广泛使用,所以希望大家可以更多的采用这种代码优化的方法

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

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

时间: 2024-08-08 09:20:32

装饰者模式与代码扩展性的探究的相关文章

设计模式入门,装饰着模式,c++代码实现

// test03.cpp : Defines the entry point for the console application.////设计模式第3章 装饰者模式#include "stdafx.h"#include <string>#include <iostream>//#include <cstring>using namespace std;class Beverage{public:    string description /*

C#装饰者模式实例代码

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 装饰者 { class Program { static void Main(string[] args) { ConcreteComponent con = new ConcreteComponent(); ConcreteDecoratorA a = new ConcreteDecoratorA();

装饰器模式与代理模式比较

当有这样的业务需求的时候——要为写好的代码在目标代码之前或者之后添加部分操作时,此时最笨的方法就是直接在目标代码的前后加上我们需要的功能代码,但是这样违背了java封装的特性.更好一点的方法就是使用设计模式——代理模式,然而,装饰器模式也有同类的功能,那么着两种设计模式到底有什么区别呢?下面就分别来学习一下这两种设计模式. 装饰器模式类图如下: 该类图包括几个部分:一个接口(装饰器与需要被装饰的实体类都需要实现该接口,公用方法在该接口中定义),一个实现类,一个装饰器的接口,具体实现的装饰器. 在

装饰者模式(Decorator Pattern)

一.装饰者模式的内容 装饰(Decorator)模式又名包装(Wrapper)模式[GOF95].装饰者模式动态地将责任附加到对象上.想要扩展功能,装饰者提供有别于继承的另一种选择.该模式以对客户端透明的方式扩展对象的功能.利用组合在运行时动态的合成自己想要的对象,这比继承更具弹性,是继承关系的一个替代方案. 二.装饰者模式的结构 涉及角色 (1)抽象构件角色:定义一个抽象接口,来规范准备附加功能的类. (2)具体构件角色(即被装饰者):将要被附加功能的类,实现抽象构件角色接口. (3)抽象装饰

Android 设计模式之装饰者模式

装饰者模式定义:动态的将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 设计原则:类应该对扩展开放,对修改关闭 在Java中IO的类就是使用了装饰都模式 相关代码:http://download.csdn.net/detail/deng0zhaotai/7964311

五分钟一个设计模式之装饰器模式

五分钟一个设计模式,用最简单的方法来描述设计模式.查看更多设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/category/3259443 示例代码 今天实在是想不出什么开场白来引出示例了,也想不出特别有意思的示例了,就用一个很土的例子来描述一下装饰器模式吧. 每个人都要穿衣服,每件衣服都具有某些特定的功能,例如,穿上鞋子的话走路舒服,穿上上衣的话上身不冷,穿上裤子的话腿不冷(你这不废话吗).也就是说,每件衣服都具有特定的

JavaSE8基础 多态扩展性 父类引用作为函数参数,调用所装子类对象的重写方法

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        代码: class Person { public void sayHello() { System.out.println("hello person"); } } class Javaer extends Person{ public void sayHello() { System.out.print

7、装饰者模式

装饰者模式 从我们之前学到的知识中, 已经知道扩展一个类的方法是为他派生新的子类, 也就是通过继承来扩展功能. 然而, 使用继承是静态的, 在编译的时候就已经决定了子类的行为, 我们不便于控制增加行为的方式和时机. 而装饰者模式可以动态地将责任附加到对象上, 若要扩展对象, 装饰者模式提供了比继承更弹性的替代方案. 使用场景:对象由主体+许多可选的部件或者功能构成,使用继承或者接口会产生很多类,且很难扩展.例如,现在需要一个汉堡,主体是鸡腿堡,可以选择添加生菜.酱.辣椒等等许多其他的配料,这种情

23种设计模式之装饰器模式(Decorator Pattern)

装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 通过采用组合.而非继承的手法,Decorator模式实现了在运行时动态地扩展对象功能的能力,而且可以根据需要扩展多个功能.避免了单独使用继承带来的“灵活性差"和"多子类衍生问题". 优点:装饰类和被装饰类可以独立发