装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。比如,我们砌的墙,第一层是基础的砖组成,第二层用砂石进行填补,第三层就用石灰进行漂白,等等还可以做更多的装饰。同样的,经过装饰后的墙,本质上还是墙,只是说变得更加丰富了。
关键代码:接口,装饰器,具体装饰类,被装饰类。
具体实现:先定义一个接口Wall,定义统一的方法draw;编写一个装饰器,实现接口Wall;可以定义多个具体的装饰类,继承装饰器Decorator;被装饰类则只需要实现接口Wall;关键点在于每个具体的装饰类里需要引用接口类,通过构造时具体传入。
优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点:多层装饰比较复杂。
1、接口
/**
* 接口
* TODO
*/
public interface Wall {
public void draw();
}
2、装饰器
/**
* 装饰器
* TODO
*/
public class WallDecorator implements Wall{
@Override
public void draw() {
}
}
3、具体装饰类
/**
* 石灰装饰类
* TODO
*/
public class KalkWallDecorator extends WallDecorator{
private Wall wall;
public KalkWallDecorator(Wall wall) {
this.wall = wall;
}
@Override
public void draw() {
wall.draw();
System.out.println("进行石灰装饰");
}
}
/**
* 沙石装饰类
* TODO
*/
public class SandWallDecorator extends WallDecorator{
private Wall wall;
public SandWallDecorator (Wall wall) {
this.wall = wall;
}
@Override
public void draw() {
wall.draw();
System.out.println("进行砂石装饰");
}
}
4、被装饰类
/**
* 基础砖墙
* TODO
*/
public class BrickWall implements Wall{
@Override
public void draw() {
System.out.println("砌基础砖墙");
}
}
5、测试
public class Test {
public static void main(String args[]) {
//不装饰
//Wall wall= new BrickWall();
//wall.draw();
//进行砂石装饰
//Wall wall= new BrickWall();
//wall = new SandWallDecorator(wall);
//wall.draw();
Wall wall= new BrickWall();
wall = new SandWallDecorator(wall);//第一次装饰
wall = new KalkWallDecorator(wall);//第二次装饰,利用第一次装饰后的墙
wall.draw();
}
}
结果: