最后
这份文档从构建一个键值数据库的关键架构入手,不仅带你建立起全局观,还帮你迅速抓住核心主线。除此之外,还会具体讲解数据结构、线程模型、网络框架、持久化、主从同步和切片集群等,帮你搞懂底层原理。相信这对于所有层次的Redis使用者都是一份非常完美的教程了。
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断!!!
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可以把相关底层代码和要点都看起来。
- 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。
- 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
- 学习以后不知道有没有学成,则可以通过面试去检验。
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目
和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!**
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目
[外链图片转存中…(img-jZWlmEET-1715488895465)]
[外链图片转存中…(img-CnLWflko-1715488895466)]