装饰设计模式
装饰模式概述
在我们今天所学的缓冲流中涉及到java的一种设计模式,叫做装饰模式,我们来认识并学习一下这个设计模式。
装饰模式指的是在不改变原类, 不使用继承的基础上,动态地扩展一个对象的功能。
装饰模式遵循原则:
-
-
在装饰类中必须传入被装饰类的引用
-
在装饰类中对需要扩展的方法进行扩展
-
在装饰类中对不需要扩展的方法调用被装饰类中的同名方法
案例演示
准备环境:
-
编写一个Star接口, 提供sing 和 dance抽象方法
-
编写一个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方法进行扩展
实现步骤:
-
编写一个LiuDeHuaWarpper类, 实现Star接口,重写抽象方法
-
提供LiuDeHuaWarpper类的有参构造, 传入LiuDeHua类对象
-
在LiuDeHuaWarpper类中对需要增强的sing方法进行增强
-
在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();
}
小结
装饰模式可以在不改变原类的基础上对类中的方法进行扩展增强,实现原则为:
-
装饰类和被装饰类必须实现相同的接口
-
在装饰类中必须传入被装饰类的引用
-
在装饰类中对需要扩展的方法进行扩展
-
在装饰类中对不需要扩展的方法调用被装饰类中的同名方法