设计模式之-----装饰者模式

来源:互联网 发布:红米note清空数据失败 编辑:程序博客网 时间:2024/06/10 20:17

今天学习了设计模式里的装饰者模式,所谓的装饰模式,顾名思义,就是将一个对象层层装饰,就如同人穿衣服一样,由内到外,衣服要一层一层的穿好,才能出门,对象也是一样,对象经过层层包装,最后包装好的对象,才是我们最后想要的。

引用百度百科的一句话: 装饰者模式就是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。

用一个例子,更能说明其作用。

(注:本例子是引用了博主为:java_my_life中使用的例子,同时对原来的例子做了很小的变动,特此声明一下,原文链接:装饰模式)

首先,包结构如下


这个例子是根据齐天大圣能进行72变化进行的例子,首先定义一个通用的接口,也就是说,不管齐天大圣怎么变,都会有的一个属性,那就是移动。所以,新建接口

package com.wrapper.component;public interface TheGreatestSage {public void move();}

接口新建完之后,当然就是写一个实现类了,齐天大圣的真身,即没有任何包装的时候,是一只猴子,那么,就新建一个猴子类

package com.wrapper.concrete.component;import com.wrapper.component.TheGreatestSage;public class Monkey implements TheGreatestSage {public void move() {System.out.println("Monkey移动");}}

这个猴子类实现了之前的接口方法,很简单,现在的猴子没有任何包装,只是单独的一只猴子而已。

不久之后,猴子遇见了师父,师父要教他72变,所以定义一个change类

package com.wrapper.decorator;import com.wrapper.component.TheGreatestSage;public class Change implements TheGreatestSage {private TheGreatestSage sage;public Change(TheGreatestSage sage) {this.sage = sage;}public void move() {sage.move();}}

要注意这个change类也要继承接口,因为不管猴子怎么变,接口中的move方法是他本身的属性,不会丢失的。

之后就是具体的变什么了,首先要变成一只小鸟,

package com.wrapper.concrete.decorator;import com.wrapper.component.TheGreatestSage;import com.wrapper.decorator.Change;public class Bird extends Change{public Bird(TheGreatestSage sage) {        super(sage);    }    @Override    public void move() {    super.move();        System.out.println("Bird Move");    }}

这里的move方法要注意了,它首先要调用父类的方法,然后调用自己的,否则就和普通的继承没有区别了。

同样的,还有鱼类

package com.wrapper.concrete.decorator;import com.wrapper.component.TheGreatestSage;import com.wrapper.decorator.Change;public class Fish extends Change {public Fish(TheGreatestSage sage) {        super(sage);    }    @Override    public void move() {    super.move();        System.out.println("Fish Move");    }}

最后的测试类

package com.wrapper.main;import com.wrapper.component.TheGreatestSage;import com.wrapper.concrete.component.Monkey;import com.wrapper.concrete.decorator.Bird;import com.wrapper.concrete.decorator.Fish;public class Client { public static void main(String[] args) {        TheGreatestSage sage = new Monkey();        // 第一种写法        TheGreatestSage bird = new Bird(sage);        TheGreatestSage fish = new Fish(bird);        // 第二种写法        //TheGreatestSage fish = new Fish(new Bird(sage));        fish.move();     }}


这样,一个装饰者模式就ok了,通过在声明的时候传递进不同的对象,将对象层层包装,最后得到我们想要的结果。




0 0
原创粉丝点击