装饰者模式
装饰模式概述
装饰模式指的是在不改变原类, 不使用继承的基础上,动态地扩展一个对象的功能。
装饰模式遵循原则:
- 装饰类和被装饰类必须实现相同的接口
- 在装饰类中必须传入被装饰类的引用
- 在装饰类中对需要扩展的方法进行扩展
- 在装饰类中对不需要扩展的方法调用被装饰类中的同名方法
案例演示
- 编写一个Star接口, 提供sing 和 dance抽象方法
- 编写一个LiuDeHua类,实现Star接口,重写抽象方法
// 需求:在不改变原类的基础上对LiuDeHua类的sing方法进行扩展
// 实现步揍:
// 1. 编写一个LiuDeHuaWarpper类, 实现Star接口,重写抽象方法
// 2. 提供LiuDeHuaWarpper类的有参构造, 传入LiuDeHua类对象
// 3. 在LiuDeHuaWarpper类中对需要增强的sing方法进行增强
// 4. 在LiuDeHuaWarpper类对不需要增强的方法调用LiuDeHua类中的同名方法
//Star 接口
public interface Star {
void sing();
void dance();
}
//刘德华类
public class Liudehua implements Star{
@Override
public void sing() {
System.out.println("刘德华本类,唱忘情水。。。");
}
@Override
public void dance() {
System.out.println("刘德华本类,在跳舞。。。");
}
}
//刘德华的包装类
public class LiudehuaWrapper implements Star{
Liudehua ldh;
public LiudehuaWrapper(Liudehua ldh) {
this.ldh = ldh;
}
@Override
public void sing() {
ldh.sing();
System.out.println("把唱歌的方法增强~~~");
}
@Override
public void dance() {
ldh.dance();
}
}
//测试类
public class Main {
//装饰者设计模式
public static void main(String[] args) {
//没有只用装饰着模式时
Liudehua liudehua = new Liudehua();
// liudehua.sing();
// liudehua.dance();
//使用装饰者模式
LiudehuaWrapper liudehuaWrapper = new LiudehuaWrapper(liudehua);
liudehuaWrapper.sing();
liudehuaWrapper.dance();
}
}