设计模式学习(九) 装饰模式

职责:

  -- 动态的为一个对象增加新的功能

  -- 装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀

实现细节:

  -- Component抽象构件角色

    真实对象和装饰对象有相同的接口。这样,客户端对象就能够以与真实对象相同的方式同装饰对象交互。

  -- ConcreteComponent具体构件角色(真实对象):

    io流中的FileInputStream. FileOutputStream

  -- Decorator装饰角色:

     持有一个抽象构件的引用,装饰对象接受所有客户端的请求,并把这些请求转发给真实的对象,这样,就    能在真实对象调用前后增加新的功能。

  -- ConcreteDecorator

    负责给构件对象增加新的责任。

代码实现:

class FlyCar extends SuperCar{

    public FlyCar(ICar car) {
        super(car);

    } 

    public void fly(){
        System.out.println("天上飞");
    }

    @Override
    public void move(){
        super.move();
        fly();
    }

}
//ConcreteDecortor具体修饰角色
class WaterCar extends SuperCar{

    public WaterCar(ICar car) {
        super(car);

    } 

    public void swim(){
        System.out.print("水里游");
    }

    @Override
    public void move(){
        super.move();
        swim();
    }
}

//ConcreteDecortor具体修饰角色
class AICar extends SuperCar{

    public AICar(ICar car) {
        super(car);

    } 

    public void autoMove(){
        System.out.print("自动游");
    }

    @Override
    public void move(){
        super.move();
        autoMove();
    }
}

具体装饰角色

package com.lp.decorator;

/*抽象组件*/
public interface ICar {
    void move();
}

抽象构件角色

/*具体构件对象*/
class Car implements ICar {

    @Override
    public void move() {
        System.out.println("陆地上跑!!");
    }

}

具体构件对象

class SuperCar implements ICar{
    private ICar car;

    public SuperCar(ICar car) {
        super();
        this.car = car;
    }

    @Override
    public void move() {
        car.move();

    }

}

装饰角色

package com.lp.decorator;

public class Client {
    public static void main(String[] args){
        Car car = new Car();
        car.move();

        System.out.println("增加新的功能:飞行------");
        FlyCar flycar = new FlyCar(car);
        flycar.move();

        System.out.println("再增加新的功能:水里游------");
        WaterCar watercar = new WaterCar(flycar);
        watercar.move();

    }
}

客户端

总结:

  -- 装饰模式(Decorator)也叫包装器模式(Wrapper)

  -- 装饰模式降低系统的耦合度,可以动态的增加或删除对象的职责,并使得需要装饰的具体构建类和具体装饰类可以独立变化,以便增加新的具体构建和具体装饰类

优点:

  -- 扩展对象功能,比继承灵活,不会导致类个数急剧增加

  -- 可以对一个对象进行多次装饰,创造出不同行为的组合,得到功能更加强大的对象

  -- 具体构建类和具体装饰类可以独立变化,用户可以根据需要自己增加新的具体构件子类和具体装饰子类。

缺点:

  -- 产生很多小对象,大量小对象占据内存,一定程度上影响性能。

  -- 装饰模式易于出错,调试排查比较麻烦。

装饰模式和桥接模式的区别:

两个模式都是为了解决过多子类对象问题,但他们的诱因不一样。

桥接模式是对象自身现有机制沿着多个维度变化,是既有部分不稳定

装饰模式是为了增加新的功能。

时间: 2024-08-07 08:38:19

设计模式学习(九) 装饰模式的相关文章

Java设计模式学习记录-装饰模式

前言 装饰模式也是一种结构型模式,主要是目的是相对于类与类之间的继承关系来说,使用装饰模式可以降低耦合度.JDK中有不少地方都使用到了装饰模式,例如Java的各种I/O流,javax.swing包中一些图形界面构件功能的增强等地方都运用了装饰模式. 装饰模式 定义 装饰模式的定义是:在不改变原类文件以及不使用继承的情况下,动态的扩展一个对象的功能.装饰模式是通过创建一个包装对象来实现的,也就是用装饰来包裹真实的对象. 举例 还是老规矩,举例说明,在给亲朋好友过生日时会买生日蛋糕,然后生日蛋糕又有

设计模式学习之装饰模式:IO流的装饰器

IO流的装饰器 题目分析:通过对java的io系列类分析得知,java的io流使用了设计模式中的装饰模式,以动态的给一个对象增加职责,能够更加灵活的增加功能.通过看io的源代码得知FilterOutputStream类继承了OutputStream类并拥有父类的一个对象,它和父类具有组合聚合的关系.因此要实现我们自己的加密类只需扩展FilterOutputStream类重写它的wite方法即可 UML图: 源代码: package com.cmc import java.io.FilterOut

设计模式学习笔记--装饰模式

1 using System; 2 3 namespace Decorator 4 { 5 /// <summary> 6 /// 作者:bzyzhang 7 /// 时间:2016/5/21 22:56:57 8 /// 博客地址:http://www.cnblogs.com/bzyzhang/ 9 /// Beverage说明:本代码版权归bzyzhang所有,使用时必须带上bzyzhang博客地址 10 /// </summary> 11 public abstract cl

设计模式学习笔记(目录篇)

设计模式学习笔记(目录篇) 为了方便查看,特此将设计模式学习笔记系列单独做一个目录. 1   设计模式学习笔记(一:命令模式) 2   设计模式学习笔记(二:观察者模式) 3   设计模式学习笔记(三:装饰模式) 4   设计模式学习笔记(四:策略模式) 5   设计模式学习笔记(五:适配器模式) 6   设计模式学习笔记(六:责任链模式) 7   设计模式学习笔记(七:外观模式) 8   设计模式学习笔记(八:迭代器模式) 9   设计模式学习笔记(九:中介者模式) 10  设计模式学习笔记(

设计模式学习总结

本文是对各处设计模式示例的总结概括和简化,主要参考 http://blog.csdn.net/zhangerqing/article/details/8194653 直接看本文估计比较枯燥无聊,因为没图~~??,建议对设计模式有兴趣的先看看上面的博文,或者基础比较好可直接移到最底下看下我的各模式一句话概括总结,有什么意见建议欢迎提出~~~~~~~~~~ 总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式.结构型模式,共七种:适配器模式.装饰

设计模式学习难度系数排名

这是yqj2065感觉的每个设计模式学习难度系数. 刘伟(Sunny)先生有一个5分制的学习难度,列在模式名称之后. 有几个模式的评价差别很大,抽象工厂模式和享元模式给4分/5,而单例模式1分/5.冠军是一样的. 学习难度系数: ☆☆☆☆☆ ☆☆☆☆☆ 依赖注入模式 静态工厂模式 2 策略模式 1 ★☆☆☆☆ ☆☆☆☆☆ 工厂方法模式 2 模板方法模式 2 适配器模式    2 责任链模式   3 外观模式 1 ★★☆☆☆ ☆☆☆☆☆ 抽象工厂模式  4 桥接模式  3 迭代器    3 享元模

设计模式学习总结系列应用实例

1.单例模式 应用实例:1.一个党只能有一个主席.2.Windows是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行.3.一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件. 2.工厂模式 应用实例:1.你需要一辆汽车,你可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现 2.Hibernate换数据库只需换方言和驱动

设计模式(九):Composite组合模式 -- 结构型模式

1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 我们可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象.我们可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象.客户端代码必须区别对象简单对象和容器对象,而实际上大多数情况下用户认为它们是一样的.对这些类区别使用,使得程序更加复杂.递归使用的时候跟麻烦,而我们如何使用递归组合,使得用户不必对这些类进行区别呢? 3.

python之路,Day24 常用设计模式学习

python之路,Day24 常用设计模式学习 本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一

设计模式 学习笔记1

2016.4.25 业务是目的:  取火 技术是方法: 钻木取火 架构师 协调业务和技术的关系,把主要业务(目的/问题)分拆成具体的技术实现方案 软件公司里头: 架构师要懂很多技术,还要有商业头脑 所谓“架构” 就是把一个大的系统给拆分,拆散后又能顺利的组装起来. 软件架构包括了:代码架构以及承载代码运行的硬件部署架构 软件开发是需要成本的,要考虑项目难度和开发周期. 技术复杂度太高,掌握这项技术的时间成本和后期维护的难度(后期维护也需要训练新员工来进行维护)就会大大增加. 所以小项目用高技术肯