Java23种设计模式——9.结构型模式之装饰模式

Java中除去有设计原则之外,还有23中设计模式。

这些模式都是前辈们一点一点积累下来,一直在改进,一直在优化的,而这些设计模式可以解决一些特定的问题。

并且在这些模式中,可以说是将语言的使用体现的淋漓尽致。

那我们今天要学习  结构型模式  中的  装饰模式  !

装饰模式

话不多说,继续百科

可以看到啊,这个装饰模式啊,很吊啊,可以动态扩展一个对象的功能,重点是动态扩展啊,这个就很霸道。

它是通过创建一个包装对象,然后用这个包装对象去包裹真实对象,给外界调用。举例说一下

我们用一个最简单的例子说一下,房子。我们刚刚买上的房子都是只有水泥钢筋啊,这个肯定不是能直接住人的,需要修饰装潢一下,比如说铺一个地板,刷一遍墙,买点家具,然后才会去居住。这里呢,我们如果用代码实现的话,就可以使用我们的装饰模式。

装饰模式的定义与特点

装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

优点:

采用装饰模式扩展对象的功能比采用继承方式更加灵活。

可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。

缺点:

装饰加的太多,你的这个子类相应的也会增加,维护就多了。

装饰模式的结构与实现

装饰模式主要有一些这样的结构:

1. 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。

2. 具体构件(Concrete    Component)角色:实现抽象构件,通过装饰角色为其添加一些职责。

3. 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。

4. 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

不要慌,我们通过案例来说明这些个东西。

 

第一步:

打开我们的eclipse,或者IDEA,创建一个项目或者像我一样创建一个包。然后创建一个接口,这个接口就是我们的抽象构件,起一个名字,叫House

当然,有了接口还不行啊,我们再定义一个方法,输出一个String类型的方法,这个方法是描述房屋的。

第二步:

我们还得有具体的构件去实现它,不然纯属就是在看房屋设计图。我们这次弄的是具体构件,来去实现刚刚的这个房子接口。

然后我们在这个接口方法中输出一句话。

第三步:

重点来了。我们这一步是来创建抽象装饰角色,这一步很重要,我们创建一个类,叫Decorator,然后让这个类也去实现房子接口

但是啊,我们这个是抽象装饰角色,如果实现了这个接口,那不就和上面的具体构件角色一样了吗?

不要慌,我们是这么玩的,继续看

我们弄一个构造函数,当然,肯定不会是无参构造,我们需要构造一个有参构造函数,传一个House。

我和大家说啊,这个house其实到时候传过来的,一定是它的子类,然后我们用子类进行调用它的TheHouseInfo。

第四步:

具体装饰角色登场了,等了好久的说,这个角色呢,是去继承我们的Decorator的。我们给这个具体修饰角色起一个类名,叫砖头

因为啥呢,砖头也属于我们的装饰,所以可以直接继承我们的装饰抽象类。这个大家要去理解。

继承之后就是这个样子,我们来说这个怎么去弄。

我们先需要重写一下这个TheHouseInfo()这个方法。

直接快捷生成一下。

这里大家看一下注释,看完以后,我们需要写我们这个类的业务。我们让这个砖头拼装一堵墙。

然后我们在这个TheHouseInfo中调用。

写到这里我们主要的东西就写完了,我们接下来弄个测试类。

测试

先实例化一下我们的房子。

然后实例化一下我们的装饰类

直接调用我们的TheHouseInfo。对了,还得改造一下我们的Brick

然后我们运行一下测试类。

完美。

如果我们现在多一个东西,比如说再多了一个地砖,做法和砖头一样,继承Decorator,然后去做实现即可。

OK,大家好好理解一下,多操作几次。谢谢大家。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

他 他 = new 他()

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值