【设计模式系列9】如何利用装饰者模式在不改变原有对象的基础上扩展功能

最后

这份文档从构建一个键值数据库的关键架构入手,不仅带你建立起全局观,还帮你迅速抓住核心主线。除此之外,还会具体讲解数据结构、线程模型、网络框架、持久化、主从同步和切片集群等,帮你搞懂底层原理。相信这对于所有层次的Redis使用者都是一份非常完美的教程了。

image

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断!!!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

public class CakeAddMangoAndGrape extends CakeAddMango {

@Override

public String getCakeMsg() {

return super.getCakeMsg() + “+1个葡萄”;

}

@Override

public BigDecimal getPrice() {

return super.getPrice().add(new BigDecimal(“5”));

}

}

写个测试类测一下:

package com.zwx.design.pattern.decorator.common;

public class TestCake {

public static void main(String[] args) {

//普通蛋糕

Cake cake = new Cake();

System.out.println(cake.getCakeMsg() + “,价格:” + cake.getPrice());

//加芒果蛋糕

CakeAddMango cakeAddMango = new CakeAddMango();

System.out.println(cakeAddMango.getCakeMsg() + “,价格:” + cakeAddMango.getPrice());

//加芒果和葡萄蛋糕

CakeAddMangoAndGrape cakeAddMangoAndGrape = new CakeAddMangoAndGrape();

System.out.println(cakeAddMangoAndGrape.getCakeMsg() + “,价格:” + cakeAddMangoAndGrape.getPrice());

}

}

输出如下结果:

我是一个8英寸的普通蛋糕,价格:68

我是一个8英寸的普通蛋糕+1个芒果,价格:78

我是一个8英寸的普通蛋糕+1个芒果+1个葡萄,价格:83

看起来挺好的,能实现,但是假如我们加2个芒果呢?或者是我要加2个普通呢,或者说芒果和葡萄要组合,数量不一定,那利用现有的类是无法实现的,只能不断加类去重写,如果业务变更频繁,修改起来会是致命的。

正因为普通的实现方法有这种缺陷,才有了装饰者模式,接下来我们来看看同一个需求利用装饰者模式是怎么实现的吧。

装饰者模式示例

====================================================================

1、新建一个蛋糕的抽象类

package com.zwx.design.pattern.decorator;

import java.math.BigDecimal;

public abstract class Cake {

public abstract String getCakeMsg();

public abstract BigDecimal getPrice();

}

2、然后新建一个普通蛋糕的类:

package com.zwx.design.pattern.decorator;

import java.math.BigDecimal;

public class BaseCake extends Cake {

@Override

public String getCakeMsg() {

return “我是一个8英寸的普通蛋糕”;

}

@Override

public BigDecimal getPrice() {

return new BigDecimal(“68”);

}

}

3、新建一个蛋糕的装饰器类,内部持有蛋糕Cake对象,这个就是扩展的关键:

package com.zwx.design.pattern.decorator;

import java.math.BigDecimal;

public abstract class CakeDecorator extends Cake{

private Cake cake;

public CakeDecorator(Cake cake) {

this.cake = cake;

}

@Override

public String getCakeMsg() {

return this.cake.getCakeMsg();

}

@Override

public BigDecimal getPrice() {

return this.cake.getPrice();

}

}

4、新建一个芒果蛋糕的装饰器类继承CakeDecorator类:

package com.zwx.design.pattern.decorator;

import java.math.BigDecimal;

public class CakeAddGrapeDecorator extends CakeDecorator {

public CakeAddGrapeDecorator(Cake cake) {

super(cake);

}

@Override

public String getCakeMsg() {

return super.getCakeMsg() + “+1个葡萄”;

}

@Override

public BigDecimal getPrice() {

return super.getPrice().add(new BigDecimal(“5”));

}

}

5、新建一个葡萄的装饰器类继承CakeDecorator类:

package com.zwx.design.pattern.decorator;

import java.math.BigDecimal;

public class CakeAddMangoDecorator extends CakeDecorator {

public CakeAddMangoDecorator(Cake cake) {

super(cake);

}

@Override

public String getCakeMsg() {

return super.getCakeMsg() + “+1个芒果”;

}

@Override

public BigDecimal getPrice() {

return super.getPrice().add(new BigDecimal(“10”));

}

}

6、最后写一个测试类测试一下:

package com.zwx.design.pattern.decorator;

public class TestCakeDecorator {

public static void main(String[] args) {

Cake cake = null;

//普通蛋糕

cake = new BaseCake();

System.out.println(cake.getCakeMsg() + “,价格:” + cake.getPrice());

//加一个芒果

cake = new CakeAddMangoDecorator(cake);

System.out.println(cake.getCakeMsg() + “,价格:” + cake.getPrice());

//加一个葡萄

cake = new CakeAddGrapeDecorator(cake);

System.out.println(cake.getCakeMsg() + “,价格:” + cake.getPrice());

//再加一个芒果

cake = new CakeAddMangoDecorator(cake);

System.out.println(cake.getCakeMsg() + “,价格:” + cake.getPrice());

}

}

输出结果为:

我是一个8英寸的普通蛋糕,价格:68

我是一个8英寸的普通蛋糕+1个芒果,价格:78

如何快速更新自己的技术积累?

  • 在现有的项目里,深挖技术,比如用到netty可以把相关底层代码和要点都看起来。
  • 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。
  • 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
  • 学习以后不知道有没有学成,则可以通过面试去检验。

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目

八年CRUD,疫情备战三个月,三面头条、四面阿里拿offer面经分享

八年CRUD,疫情备战三个月,三面头条、四面阿里拿offer面经分享

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!**

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目

[外链图片转存中…(img-jZWlmEET-1715488895465)]

[外链图片转存中…(img-CnLWflko-1715488895466)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值