学习笔记:设计模式之装饰模式
2020-08-20 本文已影响0人
大力papa
本文仅供学习交流使用,侵权必删。
不作商业用途,转载请注明出处
WHAT 什么是装饰
装饰器就是通过分层对象来动态透明地为对象增强。能够让不修改实现类代码的情况下,添加新的逻辑代码。
装饰器UML.png装饰器与代理模式的区别:
装饰器与代理看起来非常相似,但从语义上理解其实并不相同。装饰器的增强代码是与原业务逻辑相关的,例如在原来需求上添加新逻辑。代理的增强代码是与业务逻辑不相关的,例如日志记录,事务,鉴权等。
WHY 为什么使用装饰
装饰器优点
- 装饰器能够在不修改原代码的情况下对功能进行增强,符合开闭原则。
- 装饰器可以动态替换,提高扩展性和灵活性。
- 每个装饰器只专注于独立的增强方法,代码可读性高。
装饰器缺点
装饰器继承层级较深的情况下,会造成代码层级复杂,增加代码复杂性。
HOW 装饰的实现(JAVA)
场景
咖啡店有拿铁和美式咖啡,我们可以为咖啡添加双倍浓缩和加冰。而这里核心逻辑就是制作咖啡和美式,装饰就是双倍浓缩和加冰。
代码
- 接口类
public interface ICoffee {
void make();
}
- 核心逻辑类
public class Latte implements ICoffee {
@Override
public void make() {
System.out.println("Latte make");
System.out.println("Latte finish");
}
}
public class Americano implements ICoffee {
@Override
public void make() {
System.out.println("Americano make");
System.out.println("Americano finish");
}
}
- 装饰类
public abstract class AbstractCoffeeDecorator implements ICoffee {
protected ICoffee coffee;
public AbstractCoffeeDecorator(ICoffee coffee) {
this.coffee = coffee;
}
@Override
public void make() {
if (coffee != null) {
coffee.make();
}
}
}
/*
双倍浓缩
*/
public class DoubleShotDecorator extends AbstractCoffeeDecorator {
public DoubleShotDecorator(ICoffee coffee) {
super(coffee);
}
@Override
public void make() {
System.out.println("double shot");
super.make();
}
}
/*
加冰
*/
public class WithIceDecorator extends AbstractCoffeeDecorator {
public WithIceDecorator(ICoffee coffee) {
super(coffee);
}
@Override
public void make() {
super.make();
System.out.println("with ice");
}
}
- Main方法
public class DecoratorMain {
public static void main(String[] args) {
LatteDoubleShot();
AmericanoWithIce();
}
static void LatteDoubleShot() {
ICoffee latte = new Latte();
ICoffee doubleShotDecorator = new DoubleShotDecorator(latte);
doubleShotDecorator.make();
}
static void AmericanoWithIce() {
ICoffee americano = new Americano();
ICoffee withIceDecorator = new WithIceDecorator(americano);
withIceDecorator.make();
}
}