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,大家好好理解一下,多操作几次。谢谢大家。