设计模式之-----装饰者模式
2015-07-21 09:47
429 查看
今天学习了设计模式里的装饰者模式,所谓的装饰模式,顾名思义,就是将一个对象层层装饰,就如同人穿衣服一样,由内到外,衣服要一层一层的穿好,才能出门,对象也是一样,对象经过层层包装,最后包装好的对象,才是我们最后想要的。
引用百度百科的一句话: 装饰者模式就是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。
用一个例子,更能说明其作用。
(注:本例子是引用了博主为:java_my_life中使用的例子,同时对原来的例子做了很小的变动,特此声明一下,原文链接:装饰模式)
首先,包结构如下
这个例子是根据齐天大圣能进行72变化进行的例子,首先定义一个通用的接口,也就是说,不管齐天大圣怎么变,都会有的一个属性,那就是移动。所以,新建接口
接口新建完之后,当然就是写一个实现类了,齐天大圣的真身,即没有任何包装的时候,是一只猴子,那么,就新建一个猴子类
这个猴子类实现了之前的接口方法,很简单,现在的猴子没有任何包装,只是单独的一只猴子而已。
不久之后,猴子遇见了师父,师父要教他72变,所以定义一个change类
要注意这个change类也要继承接口,因为不管猴子怎么变,接口中的move方法是他本身的属性,不会丢失的。
之后就是具体的变什么了,首先要变成一只小鸟,
这里的move方法要注意了,它首先要调用父类的方法,然后调用自己的,否则就和普通的继承没有区别了。
同样的,还有鱼类
最后的测试类
这样,一个装饰者模式就ok了,通过在声明的时候传递进不同的对象,将对象层层包装,最后得到我们想要的结果。
引用百度百科的一句话: 装饰者模式就是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。
用一个例子,更能说明其作用。
(注:本例子是引用了博主为: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了,通过在声明的时候传递进不同的对象,将对象层层包装,最后得到我们想要的结果。
相关文章推荐
- Xml反序列化
- windows下编译安装BOOST
- 读取相册图片,保存至另外一个文件夹图片大小变大
- 8. JavaSE-单例设计模式
- 【JS进阶3】闭包和匿名函数
- HDU 1064 && ZOJ 1048 Financial Management【水】
- 极客学院 java 字节读取与文件拷贝 代码笔记
- Python 符号计算的瑞士军刀——SymPy
- java.net.BindException: Address already in use: JVM_Bind <null>:8080
- js获取页面及个元素高度、宽度
- Linux下编译安装BOOST
- Quartz作业调度定时完成数据库操作
- 鼠标划过表格行变色效果JS
- iOS中几种数据持久化方案:我要永远地记住你!
- Step into Kotlin - 17 - 泛型
- 自定义属性的使用方法
- Cocos2d-x 游戏植入广告(百度插屏)
- check 选择框checked属性读取不到
- 转载:浅谈实施软件测试风险分析
- 通过adb push 从电脑里拷贝文件到手机里