装饰者模式详解

装饰者模式

动态的给对象增加一些职责,即增加其额外的功能。就功能而言更加灵活,可以作为继承的替代。
优点: 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能
缺点: 多层装饰比较复杂

使用场景:

  • 扩展一个类的功能
  • 动态增加功能,动态撤销

使用实例:

Java I/O Streams

实现

现在有一幢大房子,只是毛坯房,开始给他进行装修
s

被装饰者

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:给卧室刷上粉色墙漆!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值