设计模式之-----装饰者模式
来源:互联网 发布:红米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
- 设计模式之装饰者设计模式
- 设计模式 之 装饰者
- 设计模式之装饰者模式
- 设计模式之装饰者模式
- 设计模式之Decorator(装饰者模式)
- 设计模式之五---装饰者模式
- 设计模式之---装饰者模式
- c++设计模式之装饰者模式
- Php设计模式之装饰者模式
- java设计模式之装饰者模式
- 设计模式之装饰者模式
- 【设计模式】之装饰者模式
- HeadFirst设计模式之装饰者模式
- c++设计模式之装饰者模式
- 设计模式之装饰者模式
- 设计模式之--装饰者模式
- 设计模式之装饰者模式
- 设计模式之装饰者模式
- 暑假集训第二周——递推 献给杭电五十年校庆的礼物
- hibernate学习笔记(六)
- 计蒜客430同一个节目的不同期竟然可以同时录制
- Java小数四舍五入与保留位(一)
- 天威诚信-数字证书认证系统iTrusCA
- 设计模式之-----装饰者模式
- Ubuntu 12.04下NFS安装配置图解
- [LeetCode][Java] Convert Sorted List to Binary Search Tree
- 幸运数字 1
- 关于NSString转NSURL出现省略号的问题
- 如何将ppt转成pdf样式的文档
- 彩色图像灰度化和图像二值化代码
- ProtocolBuffer在Android端的解析
- Axure RP 7.0团队项目使用笔记