Java设计模式三:装饰者模式

Java设计模式三:装饰者模式

  • 理解装饰者模式
  • 如何实现

理解装饰者模式

装饰者模式:从名字就大概知道是对已有的东西进行装饰
比如炒菜的时候需要放盐,醋,鸡精等;装修房子,需要装空调,装吊灯,装墙纸,床等,如果使用继承的方式,那么首先是空调类继承房子类,然后吊灯类继承空调类…当然还不止这些东西,那么这样会产生类爆炸。且如果墙纸我们又不需要了,想要移除,又会发生许多的类变动,这样的代码耦合度太高,十分的不灵活,因此引入了装饰者模式。

装饰者模式用于包装原有的类,且在不改变原来结构的情况下,提供了额外的功能,可以动态灵活的实现类的功能。在不想增加太多子类的情况下扩展类的情况下使用

如何实现

装饰者模式中有不同的角色:

  1. 抽象角色(Component):是需要包装的原始对象,为接口或抽象类,为总接口
  2. 具体角色(ConcreteComponent):需要装饰的具体对象
  3. 装饰角色(Decorator):继承或实现Component,是抽象类,持有对ConcreteComponent实例对象的引用
  4. 装饰具体对象(ConcreteDecorator):是具体的装饰者对象

装饰者对象和被装饰的对象都实现了相同的操作接口,装饰者将被装饰者包装起来,在同名的接口方法中,在调用被装饰者的方法之前或者之后做一些自己的操作,这样在外部调用者来看,就相当于被“装饰”了一样。

以Coffee为例,饮料是原始抽象类,咖啡是具体的实现类,糖和牛奶是具体装饰类,继承了共同的抽象装饰类

//饮料抽象类
public abstract class Drink {
    public abstract void drinking();
}
//咖啡具体类
public class Coffee extends Drink {
    @Override
    public void drinking() {
        System.out.println("喝咖啡");
    }
}
//装饰抽象类
public abstract class Decorator extends Drink {
    private Drink drink;

    public Decorator(Drink drink) {
        this.drink = drink;
    }

    @Override
    public void drinking() {
        this.drink.drinking();
    }
}
//装饰具体类1
public class Milk extends Decorator {
    public Milk(Drink drink) {
        super(drink);
    }

    @Override
    public void drinking() {
        this.addMilk();
        super.drinking();
    }

    private void addMilk() {
        System.out.println("加牛奶");
    }
}
//装饰具体类2
public class Sugar extends Decorator {
    public Sugar(Drink drink) {
        super(drink);
    }

    @Override
    public void drinking() {
        this.addSugar();
        super.drinking();
    }

    private void addSugar() {
        System.out.println("加糖");
    }
}

测试代码:

public class Main {
    public static void main(String[] args) {
        Drink drink = new Coffee();
        drink = new Sugar(drink);
        drink = new Milk(drink);
        drink.drinking();
    }
}

测试结果:
Java设计模式三:装饰者模式_第1张图片

你可能感兴趣的:(设计模式,设计模式,java,多态)