装饰者模式
动态的给对象增加一些职责,即增加其额外的功能。就功能而言更加灵活,可以作为继承的替代。
优点: 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能
缺点: 多层装饰比较复杂
使用场景:
- 扩展一个类的功能
- 动态增加功能,动态撤销
使用实例:
Java I/O Streams 、
实现
现在有一幢大房子,只是毛坯房,开始给他进行装修
被装饰者
public interface House {
/**
* 装修墙
*/
void decorateWall();
/**
* 装修地板
*/
void decorateFloor();
}
/**
* 被装饰者,初始状态会有自己的修饰
*/
public class BigHouse implements House{
@Override
public void decorateWall() {
System.out.println("ZERO:现在还是毛坯墙!");
}
@Override
public void decorateFloor() {
System.out.println("ZERO:现在还没铺地板!");
}
}
装饰者(抽象类)
public abstract class Decorator implements House{
private House house;
public Decorator(House house) {
this.house = house;
}
public void decorateWall() {
house.decorateWall();
}
public void decorateFloor() {
house.decorateFloor();
}
}
具体装饰
// 具体装饰1
public class Decorator_one extends Decorator{
public Decorator_one(House house) {
super(house);
}
@Override
public void decorateWall() {
super.decorateWall();
decorateWallOne();
}
@Override
public void decorateFloor() {
super.decorateFloor();
decorateFloorOne();
}
public void decorateWallOne() {
System.out.println("FIRST:给客厅刷上白色墙漆!");
}
public void decorateFloorOne() {
System.out.println("FIRST:给客厅铺上大理石地板!");
}
}
package zhe.designpatterns.decorator;
// 具体装饰2
public class Decorator_two extends Decorator{
public Decorator_two(House house) {
super(house);
}
@Override
public void decorateWall() {
super.decorateWall();
decorateWallTwo();
}
@Override
public void decorateFloor() {
super.decorateFloor();
decorateFloorTwo();
}
public void decorateWallTwo() {
System.out.println("SECOND:给卧室刷上粉色墙漆!");
}
public void decorateFloorTwo() {
System.out.println("SECOND:给客厅铺上实木地板!");
}
}
测试类及运行结果:
public class Test {
public static void main(String[] args) {
House house = new BigHouse();
Decorator decorator = new Decorator_two(new Decorator_one(house));
decorator.decorateFloor();
decorator.decorateWall();
}
}
-------------运行结果---------------
ZERO:现在还没铺地板!
FIRST:给客厅铺上大理石地板!
SECOND:给客厅铺上实木地板!
ZERO:现在还是毛坯墙!
FIRST:给客厅刷上白色墙漆!
SECOND:给卧室刷上粉色墙漆!