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

简介: 装饰者模式又叫包装模式。 通过另一个对象来扩展自己的行为,在不破坏类的封装的情况下,实现松耦合,易扩展的效果。   抽象组件角色: 一个抽象接口,是被装饰类和装饰类的父接口可以给这些对象动态地添加职责。
装饰者模式又叫包装模式。

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

 
抽象组件角色: 一个抽象接口,是被装饰类和 装饰类的父接口 可以给这些对象动态地添加职责
 
具体组件角色:为抽象组件的实现类, 是定义了一个具体的对象,也可以给这个对象添加一些职责
 
抽象装饰角色:包含一个组件的引用,并定义了 与抽象组件一致的接口, 继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator存在的
 
具体装饰角色:为抽象装饰角色的实现类,负责 具体的装饰。 起到给Component添加职责的功能
 

装饰者模式的使用场景:

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

  3. 不用修改给定对象的结构就可以在外部增加附加的功能。

装饰者设计模式特点:

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

装饰者设计模式常见对象:

抽象组件(类或者接口),充当被装饰的原始对象如下面例子中的Car.java接口;

组件具体实现类,继承实现抽象组件如下面的RunCar.java类,是我们装饰的具体对象;

抽象装饰类,通过有参构造方法或者传参数的方式来让内部有一个指向组件对象的引用,通过传递 抽象组件具体实现类来实现不同具体子类的操作,如下面的CarDecorator.java,SwimCarDecorator.java类 

具体抽象装饰类的实现类:如下面的FlyCarDecorator,

抽象组件角色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();
        }
    }

     


结果:
可以跑
---------
可以跑
可以游
---------
可以跑
可以游
可以飞

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

1 java IO流中使用:

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

2 android json数据解析的时候使用:
http://m.oschina.net/blog/408460。
 
3 android封装基础库的时候BaseActivity或者BaseFragment里面进行初始化操作的封装,比如initView(),initData(),initEvent()都是装饰者模式在android里面的具体实现。
 
相关文章
|
6月前
|
设计模式
设计模式13 - 装饰模式【Decorator Pattern】
设计模式13 - 装饰模式【Decorator Pattern】
14 0
|
3月前
|
设计模式
装饰者设计模式(二)番外篇 装饰者设计模式和静态代理设计模式区别
装饰者设计模式(二)番外篇 装饰者设计模式和静态代理设计模式区别
|
4月前
|
设计模式 人工智能 移动开发
认真学习设计模式之装饰者模式(Decorator Pattern)
写在前言 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。通过动态地组合对象,可以写新的代码添加新功能,而无须修改现有代码。既然没有改变现有代码,那么引进bug或产生意外副作用的机会将大幅度减少。
16 0
|
6月前
|
设计模式 Java 关系型数据库
【设计模式——学习笔记】23种设计模式——装饰器模式Decorator(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——装饰器模式Decorator(原理讲解+应用场景介绍+案例介绍+Java代码实现)
39 0
|
8月前
|
设计模式 Java
装饰与适配:解析Java设计模式中的装饰器模式和适配器模式
在软件开发领域,设计模式是一组经过实践验证的最佳实践方法,用于解决常见问题。装饰器模式和适配器模式分别是结构型设计模式中的两个重要成员,它们在不同的场景中发挥着关键作用。本文将深入了解装饰器模式和适配器模式的内涵,以及它们在Java中的实际应用。
76 0
|
11月前
|
设计模式 Java
Java设计模式-装饰器模式(Decorator)
Java设计模式-装饰器模式(Decorator)
|
设计模式 算法 API
设计模式学习(十二):Decorator装饰器模式
假如现在有一块蛋糕,如果只涂上奶油,其他什么都不加,就是奶油蛋糕。如果加上草莓,就是草莓奶油蛋糕。如果再加上一块黑色巧克力板,上面用白色巧克力写上姓名,然后插上代表年龄的蜡烛,就变成了一块生日蛋糕。
设计模式学习(十二):Decorator装饰器模式
|
设计模式 Kotlin
Kotlin设计模式实现之装饰者模式(Decorator)
装饰者模式(Decorator):在不改变对象自身的基础上,动态地给一个对象添加一些额外的职责。与继承相比,装饰者是一种更轻便灵活的做法。若要扩展功能,装饰者提供了比继承更有弹性的替代方法。
149 0
Kotlin设计模式实现之装饰者模式(Decorator)
|
设计模式
装饰者设计模式
装饰者设计模式
37 0
|
设计模式 缓存 Java
设计模式-Adapter适配器模式和Decorator装饰者模式
设计模式-Adapter适配器模式和Decorator装饰者模式
设计模式-Adapter适配器模式和Decorator装饰者模式