装饰者模式

发布 : 2018-12-05 分类 : 设计模式 浏览 :

介绍

在不必改变原类文件和使用继承的情况下, 动态地扩展一个对象的功能.

结构

  • 抽象构件: 具体构件和抽象装饰都是抽象构件的子类
  • 具体构件
  • 抽象装饰
  • 具体装饰

    mybatis -> org.apache.ibatis.cache.Cache
    

    装饰者模式

    Demo

    抽象构件(被装饰类)
    abstract class House {

    public abstract void door();
    public abstract void window();
    }
具体构件(具体被装饰的类)
public class BigHouse extends House {

@Override
public void door() {
System.out.println("大房子的门");
}

@Override
public void window() {
System.out.println("大房子的窗户");
}
}
抽象装饰

继承抽象构件, 并实现方法

abstract class Decorate extends House {

private House house;

public Decorate(House house) {
this.house = house;
}

@Override
public void door() {
house.door();
}

@Override
public void window() {
house.window();
}
}

具体装饰

具体装饰的构造一般传入被装饰类

public class WallpaperDecorate extends Decorate {

public WallpaperDecorate(House house) {
super(house);
}

@Override
public void door() {
this.addWallpaper();
super.door();
}

private void addWallpaper() {
System.out.println("为门添加墙纸");
}
}

public class WindowDecorate extends Decorate {

public WindowDecorate(House house) {
super(house);
}

@Override
public void window() {
this.addGlass();
super.window();
}

private void addGlass(){
System.out.println("为窗户添加玻璃");
}
}

总结

  • 和继承相比, 可以更灵活的扩展一个类的功能, 并且扩展组合方式较多
  • 同样和继承相比, 更容易出错

本文作者 : liuzhihang
原文链接 : https://liuzhihang.com/2018/12/05/decorator-mode.html
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

博客已萌萌哒运行(●'◡'●)ノ♥
Theme - BMW | Made With 💗 | Powered by GodBMW