装饰者模式实现

野生程序员自学之路的一点笔记心得

  • 装饰者模式解决了什么问题?
    通常为了扩展一个类,经常用继承的手段。但是随着需求变大,子类越来越多,导致子类非常多。
    利用装饰者模式,可以把编译时期的继承转换为运行时的扩展。可以在不修改任何底层代码的情况下,给对象赋予新的职责

装饰者模式举例

我就用装潢房子来举例子,一个没被装修的房子是一个对象,但是装修之后成为了什么样子的对象是一个动态的对象,可以是一个豪华的房子,也可以是一个陋室。这个例子进行抽象。

  • 房子:被装饰者
  • 不同规格的瓷砖,家具等:装饰者(装饰房子)
    不用在编译时期,继承出所有的房子的样式,可以在运行期间动态的造出一个指定样式的房子

装饰者模式类图

在这里插入图片描述
重要的几点说明:

  • 装饰者和被装饰者对象有相同的超类型。
    这是因为利用多态的性质,可以多层装饰(包装),可以把装饰过的对象继续当作House类型,稍后我会用装修房子的例子来实现二次装饰
  • 装饰者可以在被装饰者的行为之前或者之后,再加上装饰者本身自己的行为,以达到特定的目的
  • 对象可以在任何时候被装饰,所以可以在运行时动态地,不限量地用你喜欢的装饰者来装饰对象

根据上面的类图来实现一个装修房子的例子

public interface House {
    public void description();
}

下面是房子的类型

public class Loushi implements House {
    @Override
    public void description() {
        System.out.println("this is my loushi");
    }
}
public class Yangfang implements House {
    @Override
    public void description() {
        System.out.println("this is your yangfang");
    }
}

这个是装饰器的抽象类

public abstract  class Decorator implements House {
    House decoratoredHouse;
}

public class LowDecorator extends Decorator {
    House decoratoredHouse;

    public LowDecorator(House decoratoredHouse) {
        this.decoratoredHouse = decoratoredHouse;
    }

    @Override
    public void description() {
        decoratoredHouse.description();
        System.out.println("low的装修安排上");
    }
}
public class LuxuryDecorator extends Decorator {
    House decoratoredHouse;

    public LuxuryDecorator(House decoratoredHouse) {
        this.decoratoredHouse = decoratoredHouse;
    }

    @Override
    public void description() {
        decoratoredHouse.description();
        System.out.println("luxury的装修安排上");
    }
}

测试代码:

public class Main {
    public static void main(String[] args){
     House myHouse = new LuxuryDecorator(new LowDecorator(new Loushi()));
     myHouse.description();
    }
}

这里就实现了二次装饰,不管装修多少次,都是House类型,通过下面这张图来形象的描述一下

在这里插入图片描述
刚开始是一个陋室对象,第一次装饰这个陋室,把这个陋室放进LowDecorator里面,这两个的组合也是一个House类型,所以可以继续用多态的性质来装饰,在具体的方法调用顺序上面,看自己的需求即可
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值