设计模式--装饰者设计模式(Decorator)
通过另一个对象来扩展自己的行为,在不破坏类的封装的情况下,实现松耦合,易扩展的效果。
装饰者模式的使用场景:
1.当我们需要为某个现有的对象,动态的增加一个新的功能或职责时,可以考虑使用装饰模式。
2.当某个对象的职责经常发生变化或者经常需要动态的增加职责,避免为了适应这样的变化,而增加继承子类扩展的方式,因为这种方式会造成子类膨胀的速度过快,难以控制。
3. 不用修改给定对象的结构就可以在外部增加附加的功能。
装饰者设计模式特点:
- 装饰是构造函数参数传递进行增强;
- 装饰模式比继承要灵活。避免了继承体系臃肿。
- 而且降低了类于类之间的关系。
- 装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
装饰者设计模式常见对象:
抽象组件(类或者接口),充当被装饰的原始对象如下面例子中的Car.java接口;
组件具体实现类,继承实现抽象组件如下面的RunCar.java类,是我们装饰的具体对象;
抽象装饰类,通过有参构造方法或者传参数的方式来让内部有一个指向组件对象的引用,通过传递 抽象组件具体实现类来实现不同具体子类的操作,如下面的CarDecorator.java,SwimCarDecorator.java类 ;
具体抽象装饰类的实现类:如下面的FlyCarDecorator,
package com.soyoungboy.example2;
public interface Car { public void show(); public void run();
}
public class RunCar implements Car {
public void run() {
System.out.println("可以跑");
}
public void show() {
this.run();
}
}
public abstract class CarDecorator implements Car{
private Car car; public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public CarDecorator(Car car) {
this.car = car;
} public abstract void show();
}
public class FlyCarDecorator extends CarDecorator{
public FlyCarDecorator(Car car) {
super(car);
}
public void show() {
this.getCar().show();
this.fly();
} public void fly() {
System.out.println("可以飞");
}
public void run() { }
}
public class SwimCarDecorator extends CarDecorator {
public SwimCarDecorator(Car car) {
super(car);
}
public void show() {
this.getCar().show();
this.swim();
} public void swim() {
System.out.println("可以游");
}
public void run() { }
}
public class MainClass {
public static void main(String[] args) {
//普通的車,只能跑
Car car = new RunCar(); car.show();
System.out.println("---------"); //給車添加新功能,既能跑,也能游泳
Car swimcar = new SwimCarDecorator(car);
swimcar.show();
System.out.println("---------"); //給車添加新功能,既能跑,也能游泳,還能飛
Car flySwimCar = new FlyCarDecorator(swimcar);
flySwimCar.show();
}
}
装饰者设计模式在实际开发中的使用:
例如 BufferedInputStream bis = new BufferedInputStream(new FileInputStream());
设计模式--装饰者设计模式(Decorator)的更多相关文章
- 浅谈设计模式--装饰者模式(Decorator Pattern)
挖了设计模式这个坑,得继续填上.继续设计模式之路.这次讨论的模式,是 装饰者模式(Decorator Pattern) 装饰者模式,有时也叫包装者(Wrapper),主要用于静态或动态地为一个特定的对 ...
- 说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现
返回目录 为何要设计多功能消息组件 之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以 ...
- 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法
装饰者模式(Decorator Pattern) Java的IO类 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716 ...
- 设计模式 - 装饰者模式(Decorator Pattern) 具体解释
装饰者模式(Decorator Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26707033 装饰者 ...
- 大话设计模式--装饰者模式 Decorator -- C++实现实例
1.装饰者模式 Decorator 动态地给一个对象添加一个额外的职责, 就添加功能来说, 装饰模式比生成子类更为灵活. 每个装饰对象的实现和如何使用这个对象分离, 每个装饰对象只关心自己的功能,不 ...
- C#设计模式——装饰者模式(Decorator Pattern)
一.例子在软件开发中,我们往往会想要给某一类对象增加不同的功能.比如要给汽车增加ESP.天窗或者定速巡航.如果利用继承来实现,就需要定义无数的类,Car,ESPCar,CCSCar,SunRoofCa ...
- 说说设计模式~装饰器模式(Decorator)
返回目录 装饰器模式,也叫又叫装饰者模式,顾名思义,将一个对象进行包裹,包装,让它变成一个比较满意的对象,这种模式在我们平时项目开发中,经常会用到,事实上,它是处理问题的一种技巧,也很好的扩展了程序, ...
- 【设计模式】Java设计模式 - 装饰者模式
Java设计模式 - 装饰者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自 ...
- 设计模式(八)装饰器模式Decorator(结构型)
设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法 ...
随机推荐
- 使用gulp构建自动化工作流
简单易用 高效构建 高质量的生态圈 可能很多人会说现在提gulp也太落后了吧,但我想说写点东西并不是为了讨论它是否过时,而是来帮助我们自己来记忆.整理和学习.任何工具,我需要,我才去使用它,正如此时我 ...
- Entity Framework With Oracle
参考页面: http://www.yuanjiaocheng.net/Entity/first.html http://www.yuanjiaocheng.net/Entity/jieshao.htm ...
- STURTS2 HELLOWORLD
4. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC " ...
- VFL语言使用
- C#带参数打开网页及url获取
1.带参数打开网页 Response.Redirect("form2.aspx?id=url1&name=ok"); 其中?后面为参数. 2.获取url 命令 结果 Req ...
- Tweak 中系统方法写入文件到根目录下面失败
Tweak 中系统方法写入文件到根目录下面失败 失败原因: Error Domain=NSCocoaErrorDomain Code=513 "The operation couldn’t ...
- C# 图形普通处理,resize ,水印..
网站中,对用户图片上传处理是很有必要的.对于一些常用的处理,对图片各种形式的压缩,各种形式的水印. 1.裁剪正方形头像方法 /// <summary> /// 正方型裁剪 /// 以图片中 ...
- uinty3d使用ugui封装一个分页控件
我们在显示数据时有的数据比较多,手机内存有限,我们不可能分配很多的控件来显示这些数据,分页是一个不错的选择.比如玩家交易行.我们现在封装一个自己简单的分页控件来显示玩家交易行. 分页控件的原理其实很简 ...
- textfile 属性
//设置textfile的Placeholder的颜色和字体大小 nameText.attributedPlaceholder = NSAttributedString.init(string: &q ...
- Symfony没有安装依赖_PHP Fatal error: require(): Failed opening required
$ php bin/console server:run PHP Warning: require(D:\home\workspace\pd\app/../vendor/autoload.php): ...