设计模式之装饰器模式
2016-04-10 15:56
295 查看
**定义:**Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样。因此,装饰器模式具有如下的特征:
它必须具有一个装饰的对象。
它必须拥有与被装饰对象相同的接口。
它可以给被装饰对象添加额外的功能。
用一句话总结就是:保持接口,增强性能。
装饰器通过包装一个装饰对象来扩展其功能,而又不改变其接口,这实际上是基于对象的适配器模式的一种变种。它与对象的适配器模式的异同点如下。
相同点:都拥有一个目标对象。
不同点:适配器模式需要实现另外一个接口,而装饰器模式必须实现该对象的接口。
代码实例如下:
从上面的代码例子中可以看出,装饰模式就是在原来的基础上,再扩展功能,装饰类通过实现原来功能的接口,然后再通过具体的装饰类继承这个装饰类重写装饰类中的方法,这样就扩展了功能。
它必须具有一个装饰的对象。
它必须拥有与被装饰对象相同的接口。
它可以给被装饰对象添加额外的功能。
用一句话总结就是:保持接口,增强性能。
装饰器通过包装一个装饰对象来扩展其功能,而又不改变其接口,这实际上是基于对象的适配器模式的一种变种。它与对象的适配器模式的异同点如下。
相同点:都拥有一个目标对象。
不同点:适配器模式需要实现另外一个接口,而装饰器模式必须实现该对象的接口。
代码实例如下:
//大圣的尊号 public interface TheGreatestSage { public void move(); } public class Monkey implements TheGreatestSage { public void move() { //代码 System.out.println("Monkey Move"); } } public class Change implements TheGreatestSage { private TheGreatestSage sage; public Change(TheGreatestSage sage){ this.sage = sage; } public void move() { // 代码 sage.move(); } } public class Fish extends Change { public Fish(TheGreatestSage sage) { super(sage); } @Override public void move() { // 代码 System.out.println("Fish Move"); } } public class Bird extends Change { public Bird(TheGreatestSage sage) { super(sage); } @Override public void move() { // 代码 System.out.println("Bird Move"); } } public class Client { public static void main(String[] args) { TheGreatestSage sage = new Monkey(); TheGreatestSage bird = new Bird(sage); TheGreatestSage fish = new Fish(sage); sage.move(); bird.move(); fish.move(); // 第一种写法 // TheGreatestSage bird = new Bird(sage); // TheGreatestSage fish = new Fish(sage); // 第二种写法 //TheGreatestSage fish = new Fish(new Bird(sage)); // fish.move(); // bird.move(); } }
从上面的代码例子中可以看出,装饰模式就是在原来的基础上,再扩展功能,装饰类通过实现原来功能的接口,然后再通过具体的装饰类继承这个装饰类重写装饰类中的方法,这样就扩展了功能。
相关文章推荐
- 导航控制器实例——锤子标签
- Android 通过webservice上传多张图片到指定服务器上面
- RecyclerView.Adapter优化了吗?
- maven+srping+springmvc+mybatis的环境搭建的每一步和代码
- 构造方法实验代码
- 可执行程序的装载
- *windows.event对象在ie与ff中的区别**
- 剑指offer系列之5:用两个栈来实现队列
- shell uniq 和sort 简单用法及实例
- Git入门
- 区间调度问题
- 冒泡排序、选择和插入排序、二分法查找
- servlet/filter/listener/interceptor区别与联系
- 华为OJ题目(二十一):输入n个整数,输出其中最小的k个
- email正则表达式 验证邮箱格式
- ASP.NET MVC4入门教程(四):添加一个模型
- 网站挂马解决方案
- RTSP协议、RTMP协议、HTTP协议的区别
- 1005. 继续(3n+1)猜想 (25)
- 在类中使用类成员函数创建线程