学习笔记:设计模式之装饰模式

2020-08-20  本文已影响0人  大力papa

本文仅供学习交流使用,侵权必删。
不作商业用途,转载请注明出处

WHAT 什么是装饰

装饰器就是通过分层对象来动态透明地为对象增强。能够让不修改实现类代码的情况下,添加新的逻辑代码。

装饰器UML.png

装饰器与代理模式的区别:

装饰器与代理看起来非常相似,但从语义上理解其实并不相同。装饰器的增强代码是与原业务逻辑相关的,例如在原来需求上添加新逻辑。代理的增强代码是与业务逻辑不相关的,例如日志记录,事务,鉴权等。

WHY 为什么使用装饰

装饰器优点

  1. 装饰器能够在不修改原代码的情况下对功能进行增强,符合开闭原则。
  2. 装饰器可以动态替换,提高扩展性和灵活性。
  3. 每个装饰器只专注于独立的增强方法,代码可读性高。

装饰器缺点

装饰器继承层级较深的情况下,会造成代码层级复杂,增加代码复杂性。

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");
    }
}

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();
    }
}

持续更新...

上一篇 下一篇

猜你喜欢

热点阅读