包装模式也叫装饰模式,最典型的例子就是文件的读取,本质上其实还是对目标对象类的功能增强,或者说优化都可以。一般想要增强对象首先想到的就是继承,但是限制就是父类自带的数据,也就是属性,子类是无法变更的,能变更的只能是方法,而且变更之后想再修改就费劲了;那如果我真想修改最省劲的办法就是继续继承一下,那有时候我想继承这个但是有一点地方不对那不好意思不能继承你得重新写一遍;而且继承的层级多了复杂度就上去了,也不利于维护;一般继承4级基本就差不多了,像那种上十层的继承看着就头疼;
    由此可以引申出来:
    包装模式主要用户需求变动大,避免类爆炸的情况发生;

    当然局限性也是有的,就是需要接口

    使用jdk1.8来编写代码;
    下面的例子是用phone 对象 call 举例 ,首先得抽象出接口来,然后构建装饰器,再去构建前置或者后置方法,然后去new装饰类就实现了对call方法的增强;

    1. // 一个良好的设计是抽取成接口或者抽象类的
    2. public interface Phone {
    3. // 可以打电话
    4. void call();
    5. }
    6. //默认实现
    7. public class IphoneX implements Phone {
    8. @Override
    9. public void call() {
    10. System.out.println("打电话");
    11. }
    12. }
    13. // 装饰器,实现接口
    14. public abstract class PhoneDecorate implements Phone {
    15. // 以组合的方式来获取默认实现类
    16. private Phone phone;
    17. public PhoneDecorate(Phone phone) {
    18. this.phone = phone;
    19. }
    20. @Override
    21. public void call() {
    22. phone.call();
    23. }
    24. }
    25. // 继承着装饰器来扩展实现 在打电话之前听音乐
    26. public class MusicPhone extends PhoneDecorate {
    27. public MusicPhone(Phone phone) {
    28. super(phone);
    29. }
    30. // 定义想要扩展的功能
    31. public void listenMusic() {
    32. System.out.println("继续跑 带着赤子的骄傲,生命的闪耀不坚持到底怎能看到,与其苟延残喘不如纵情燃烧");
    33. }
    34. // 重写打电话的方法
    35. @Override
    36. public void call() {
    37. // 在打电话之前听音乐
    38. listenMusic();
    39. super.call();
    40. }
    41. }
    42. // 这里继承的是MusicPhone装饰器类实现 打完电话后通知一下当前时间
    43. public class GiveCurrentTimePhone extends PhoneDecorate {
    44. public GiveCurrentTimePhone(Phone phone) {
    45. super(phone);
    46. }
    47. // 自定义想要实现的功能:给出当前的时间
    48. public void currentTime() {
    49. System.out.println("当前的时间是:" + System.currentTimeMillis());
    50. }
    51. // 重写要增强的方法
    52. @Override
    53. public void call() {
    54. super.call();
    55. // 打完电话后通知一下当前时间
    56. currentTime();
    57. }
    58. }
    59. //最后运行
    60. // 先增强听音乐的功能,再增强通知时间的功能
    61. Phone phone = new GiveCurrentTimePhone(new MusicPhone(new IphoneX()));