装饰者模式学习笔记

最近看了一个视频教程,讲到装饰者模式,为加深一下理解,所以在这里做个笔记

一,为什么要用到装饰者模式

开发中,有时我们需要对一个对象的功能进行增强。通常的增强方式有:
1. 继承
被增强的对象是固定的,不能改变
增强也是固定的,不能改变
2. 装饰者模式
被增强的对象是可以变化的
增强的内容是固定的
3. 动态代理
为什么在有的时候要使用装饰者模式:
(这个例子是学习材料中说的,不是我自己想出来的)
比如说有一个咖啡类,他下面分别有加糖咖啡,加奶咖啡,加盐咖啡。当我们需要加糖加奶咖啡,加奶加盐咖啡……

class 咖啡类{ }
class 加糖咖啡 extennds 咖啡类{ }
class 加奶咖啡 extennds 咖啡类{ }
class 加盐咖啡 extennds 咖啡类{ }
……
这种排列组合会使类的数目暴增,当我们在后来又有了比如说加柠檬的咖啡时,又会增加很多组合。
这种情况下我们就需要使用装饰者模式了。

二,装饰者模式Demo代码实现

是你还有你,一切拜托你。
1. 装饰类继承或者实现装饰类。
2. 在装饰类中含有一个被装饰类的对象作为成员,在构造方法中可以传入一个被装饰类的对象,对这个成员进行初始化,然后我们就可以进行功能的增强。

代码:

//接口
public interface Kafei {
/**
 * 口味
 */
public void kouwei();
}

实现类:
加奶类:

public class NaiKafei implements Kafei {
private Kafei kafei;

public NaiKafei() {
}

public NaiKafei(Kafei kafei) {
    this.kafei = kafei;
}

@Override
public void kouwei() {
    System.out.print("加奶");
    if (kafei != null) {
        // 此时使用的是有参数的构造方法,说明咖啡要加多种材料
        kafei.kouwei();
        }
    }
}

加糖类:

public class TangKafei implements Kafei {
private Kafei kafei;

public TangKafei() {
}

public TangKafei(Kafei kafei) {
    this.kafei = kafei;
}

@Override
public void kouwei() {
    System.out.print("加糖");
    if (kafei != null) {
        // 此时使用的是有参数的构造方法,说明咖啡要加多种材料
        kafei.kouwei();
        }
    }
}

加盐类:

public class YanKafei implements Kafei {
private Kafei kafei;

public YanKafei() {
}

public YanKafei(Kafei kafei) {
    this.kafei = kafei;
}

@Override
public void kouwei() {
    System.out.print("加盐");
    if (kafei != null) {
        // 此时使用的是有参数的构造方法,说明咖啡要加多种材料
        kafei.kouwei();
        }
    }
}

测试类:

public class Demo {
@Test
public void fun1() {
    // 加糖咖啡
    Kafei tangKafei = new TangKafei();
    tangKafei.kouwei();
}

@Test
public void fun2() {
    // 加奶加糖咖啡
    Kafei naiKafei = new NaiKafei();
    Kafei tangKafei = new TangKafei(naiKafei);
    tangKafei.kouwei();
}

@Test
public void fun3() {
    // 加奶加糖加盐咖啡
    Kafei naiKafei = new NaiKafei();
    Kafei tangKafei = new TangKafei(naiKafei);
    Kafei yanKafei = new YanKafei(tangKafei);
    yanKafei.kouwei();
    }
}

在测试类中,我们可以看到我们可以随意进行组合,而类的数量只有基础的几个。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值