装饰设计模式

装饰模式概述

在我们今天所学的缓冲流中涉及到java的一种设计模式,叫做装饰模式,我们来认识并学习一下这个设计模式。

装饰模式指的是在不改变原类, 不使用继承的基础上,动态地扩展一个对象的功能。

装饰模式遵循原则:

  1. 装饰类和被装饰类必须实现相同的接口

  2. 在装饰类中必须传入被装饰类的引用

  3. 在装饰类中对需要扩展的方法进行扩展

  4. 在装饰类中对不需要扩展的方法调用被装饰类中的同名方法

案例演示

准备环境:
  1. 编写一个Star接口, 提供sing 和 dance抽象方法

  2. 编写一个LiuDeHua类,实现Star接口,重写抽象方法

1 public interface Star {
2     public void sing();
3     public void dance();
4 }
 1 public class LiuDeHua implements Star {
 2     @Override
 3     public void sing() {
 4         System.out.println("刘德华在唱忘情水...");
 5     }
 6     @Override
 7     public void dance() {
 8         System.out.println("刘德华在跳街舞...");
 9     }
10 }
需求:

在不改变原类的基础上对LiuDeHua类的sing方法进行扩展

实现步骤:
  1. 编写一个LiuDeHuaWarpper类, 实现Star接口,重写抽象方法

  2. 提供LiuDeHuaWarpper类的有参构造, 传入LiuDeHua类对象

  3. 在LiuDeHuaWarpper类中对需要增强的sing方法进行增强

  4. 在LiuDeHuaWarpper类对不需要增强的方法调用LiuDeHua类中的同名方法

实现代码如下

LiuDeHua类: 被装饰类

LiuDeHuaWarpper类: 我们称之为装饰类

/*
    装饰模式遵循原则:
        装饰类和被装饰类必须实现相同的接口
        在装饰类中必须传入被装饰类的引用
        在装饰类中对需要扩展的方法进行扩展
        在装饰类中对不需要扩展的方法调用被装饰类中的同名方法
*/
public class LiuDeHuaWarpper implements Star {
    // 存放被装饰类的引用
    private LiuDeHua liuDeHua;
    // 通过构造器传入被装饰类对象
    public LiuDeHuaWarpper(LiuDeHua liuDeHua){
        this.liuDeHua = liuDeHua;
    }
    @Override
    public void sing() {
        // 对需要扩展的方法进行扩展增强
        System.out.println("刘德华在鸟巢的舞台上演唱忘情水.");
    }
    @Override
    public void dance() {
        // 不需要增强的方法调用被装饰类中的同名方法
        liuDeHua.dance();
    }
}
测试结果
public static void main(String[] args) {
    // 创建被装饰类对象
    LiuDeHua liuDeHua = new LiuDeHua();
    // 创建装饰类对象,被传入被装饰类
    LiuDeHuaWarpper liuDeHuaWarpper = new LiuDeHuaWarpper(liuDeHua);
    // 调用装饰类的相关方法,完成方法扩展
    liuDeHuaWarpper.sing();
    liuDeHuaWarpper.dance();
}

小结

装饰模式可以在不改变原类的基础上对类中的方法进行扩展增强,实现原则为:

  1. 装饰类和被装饰类必须实现相同的接口

  2. 在装饰类中必须传入被装饰类的引用

  3. 在装饰类中对需要扩展的方法进行扩展

  4. 在装饰类中对不需要扩展的方法调用被装饰类中的同名方法

 

posted @ 2020-12-14 14:47  乃颜先生  阅读(107)  评论(0编辑  收藏  举报