设计模式--装饰者设计模式(Decorator)

装饰者模式又叫包装模式。

通过另一个对象来扩展自己的行为,在不破坏类的封装的情况下,实现松耦合,易扩展的效果

抽象组件角色: 一个抽象接口,是被装饰类和装饰类的父接口可以给这些对象动态地添加职责。

具体组件角色:为抽象组件的实现类,是定义了一个具体的对象,也可以给这个对象添加一些职责。

抽象装饰角色:包含一个组件的引用,并定义了与抽象组件一致的接口,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator存在的。

具体装饰角色:为抽象装饰角色的实现类,负责具体的装饰。起到给Component添加职责的功能。

装饰者模式的使用场景:

1.当我们需要为某个现有的对象,动态的增加一个新的功能或职责时,可以考虑使用装饰模式。2.当某个对象的职责经常发生变化或者经常需要动态的增加职责,避免为了适应这样的变化,而增加继承子类扩展的方式,因为这种方式会造成子类膨胀的速度过快,难以控制。
3. 不用修改给定对象的结构就可以在外部增加附加的功能。

装饰者设计模式特点:

  1. 装饰是构造函数参数传递进行增强;
  2. 装饰模式比继承要灵活。避免了继承体系臃肿。
  3. 而且降低了类于类之间的关系。
  4. 装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。

抽象组件角色Car.java 包含汽车的基本功能的抽象方法 run():

  1. package com.soyoungboy.example2;
    public interface Car {
    
        public void show();
    
        public void run();
    }

具体组件角色RunCar.java 实现run():

  1. public class RunCar implements Car {
        public void run() {
            System.out.println("可以跑");
        }
        public void show() {
            this.run();
        }
    }

抽象装饰角色CarDecorator.java ,实现Car接口,提供传进来Car对象的构造方法和获取Car的getCar方法:

  1. public abstract class CarDecorator implements Car{
        private Car car;
    
        public Car getCar() {
            return car;
        }
        public void setCar(Car car) {
            this.car = car;
        }
        public CarDecorator(Car car) {
            this.car = car;
        }
    
        public abstract void show();
    }

具体装饰角色1 FlyCarDecorator.java,继承自CarDecorator,具体实现车会飞的功能,传进来的car来进行功能扩展的:

  1. public class FlyCarDecorator extends CarDecorator{
        public FlyCarDecorator(Car car) {
            super(car);
        }
        public void show() {
            this.getCar().show();
            this.fly();
        }
    
        public void fly() {
            System.out.println("可以飞");
        }
        public void run() {
    
        }
    }

具体装饰角色2 SwimCarDecorator.java 继承自CarDecorator,具体实现车会游泳的功能:

  1. public class SwimCarDecorator extends CarDecorator {
        public SwimCarDecorator(Car car) {
            super(car);
        }
        public void show() {
            this.getCar().show();
            this.swim();
        }
    
        public void swim() {
            System.out.println("可以游");
        }
        public void run() {
    
        }
    }

测试类:

  1. public class MainClass {
        public static void main(String[] args) {
            //普通的車,只能跑
            Car car = new RunCar();
    
            car.show();
            System.out.println("---------");
    
            //給車添加新功能,既能跑,也能游泳
            Car swimcar = new SwimCarDecorator(car);
            swimcar.show();
            System.out.println("---------");
    
            //給車添加新功能,既能跑,也能游泳,還能飛
            Car flySwimCar = new FlyCarDecorator(swimcar);
            flySwimCar.show();
        }
    }


结果:

可以跑

---------

可以跑

可以游

---------

可以跑

可以游

可以飞

装饰者设计模式在实际开发中的使用:

java IO流中使用:

例如    BufferedInputStream bis = new BufferedInputStream(new FileInputStream());

android json数据解析的时候使用:

http://m.oschina.net/blog/408460

时间: 2024-08-03 20:25:16

设计模式--装饰者设计模式(Decorator)的相关文章

设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 使用方法

装饰者模式(Decorator Pattern) Java的IO类 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716823 装饰者模式(decorator pattern)参见: http://blog.csdn.net/caroline_wendy/article/details/26707033 Java的IO类使用装饰者模式进行扩展, 其中FilterInputStream类, 就是装饰者(decora

设计模式 - 装饰者模式(Decorator Pattern) 详解

装饰者模式(Decorator Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26707033 装饰者模式(Decorator Pattern):动态地将责任附加到对象上. 若要扩展功能, 装饰者提供了比继承更有弹性的替代方案. 使用方法: 1. 首先创建组件(Component)父类, 所有类,具体组件(Concrete Component)和装饰者(Decorator)都属于这一类型, 可以进行扩展

说说设计模式~装饰器模式(Decorator)

装饰器模式,也叫又叫装饰者模式,顾名思义,将一个对象进行包裹,包装,让它变成一个比较满意的对象,这种模式在我们平时项目开发中,经常会用到,事实上,它是处理问题的一种技巧,也很好的扩展了程序,让程序代码不那么死板! 何时能用到它? 1. 需要扩展一个类的功能,或给一个类添加附加职责. 2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销. 3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实. 4. 当不能采用生成子类的方法进行扩充时. 其中我们认为第四种

设计模式 - 装饰者模式(Decorator Pattern) 具体解释

装饰者模式(Decorator Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26707033 装饰者模式(Decorator Pattern):动态地将责任附加到对象上. 若要扩展功能, 装饰者提供了比继承更有弹性的替代方案. 用法: 1. 首先创建组件(Component)父类, 全部类,详细组件(Concrete Component)和装饰者(Decorator)都属于这一类型, 能够进行扩展

Java设计模式——装饰器模式(Decorator)

孙悟空有七十二般变化,他的每一种变化都给他带来一种附加本领.而不管孙悟空怎么变化在二郎神眼里,他永远是那只猢狲. 装饰器模式以对客户透明的方式动态的给一个对象附加上更多的责任. 在孙悟空的例子里,老孙变成的鱼儿相当于老孙的子类. 装饰模式的类图如下: 装饰模式的角色介绍: 抽象构件角色(ComponentDec):给出一个抽象接口,以规范准备接收附加责任的对象 具体构件(Concrete ComponentDec):定义一个将要接收附加责任的类 装饰角色(Decortor):持有一个构件对象的实

设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法

装饰者模式(Decorator Pattern) Java的IO类 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716823 装饰者模式(decorator pattern)參见: http://blog.csdn.net/caroline_wendy/article/details/26707033 Java的IO类使用装饰者模式进行扩展, 当中FilterInputStream类, 就是装饰者(decorato

说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现

返回目录 为何要设计多功能消息组件 之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以通过配置进行一种消息的订制,如,你可以订制email,sms,rtx,qq等,但不能同时采用多种机制完成消息的发送,这在一些情况下是没有问题的,但有时,我们也需要同时为客户提供多种消息的推送,这在目前还是挺现时的,如在用户下单后,同时为它发email 和短信进行通过,并对每个订单的过程进行跟踪并通知

设计模式 装饰者设计模式

设计模式简介 什么是设计模式?设计模式是可以重复利用的解决方案.软件开发的先驱或者前辈们将之前在开发中遇到的问题进行总结并给出了解决方案,后辈在遇到这些问题之后直接使用这些方案即可解决问题.比如盖高楼,都是先挖地基,然后再盖,如果先盖楼后挖地基,可能盖不了几层,楼就倒了. 装饰者设计模式 使用场景:给某个对象的功能进行扩展时,可以考虑使用装饰者设计模式.在IO流这部分内容中,JDK的源码使用了大量的装饰者设计模式.比如BufferedReader可以对FileReader进行装饰.以去拉面馆吃拉

Android设计模式之中的一个个样例让你彻底明确装饰者模式(Decorator Pattern)

导读 这篇文章中我不会使用概念性文字来说明装饰者模式.由于通常概念性的问题都非常抽象.非常难懂.使得读者非常难明确究竟为什么要使用这样的设计模式.我们设计模式的诞生,肯定是前辈们在设计程序的时候遇到了某种困难,为了避免这样的苦难的发生,从而设计出来的这样的设计模式,所以这篇文章中我会带领大家遇见这样的困难,从而使用设计模式解决这样的困难,最后大家就会明确什么是设计者模式,什么时候应该使用设计者模式以及怎样使用设计者模式了 首先我们先来看一下装饰者模式的UML图是什么样子的.图中各个类的含义不懂没