07装饰模式Decorator
一、什么是装饰模式
装饰( Decorator )模式又叫做包装模式。通 过一种对客户端透明的方式来扩展对象的功能, 是继承关系的一个替换方案。
二、装饰模式的结构

三、装饰模式的角色和职责
抽象组件角色: 一个抽象接口,是被装饰类和 装饰类的父接口。
具体组件角色:为抽象组件的实现类。
抽象装饰角色:包含一个组件的引用,并定义了 与抽象组件一致的接口。
具体装饰角色:为抽象装饰角色的实现类。负责 具体的装饰。
没装饰前
车接口
//车接口
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 class FlyCar implements Car { public void show() {
this.run();
this.fly();
} public void run() {
System.out.println("可以跑");
} public void fly() {
System.out.println("可以飞");
}
}
游泳的车
//游泳的车
public class SwimCar implements Car{ public void run() {
System.out.println("可以跑");
} public void Swim() {
System.out.println("可以游");
} public void show() {
this.run();
this.Swim();
}
}
测试
public class MainClass {
public static void main(String[] args) {
Car flycar = new SwimCar();
flycar.show();
}
}
===========================================================================
车接口
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 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 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 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();
}
}
07装饰模式Decorator的更多相关文章
- 装饰模式/decorator模式/结构型模式
装饰模式Decorator 定义 为对象动态的增加新的功能,实现要求装饰对象和被装饰对象实现同一接口或抽象类,装饰对象持有被装饰对象的实例. java实现要点 定义一个接口或抽象类,作为被装饰者的抽象 ...
- 二十四种设计模式:装饰模式(Decorator Pattern)
装饰模式(Decorator Pattern) 介绍动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活.示例有一个Message实体类,某个对象对它的操作有Insert()和 ...
- 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)
原文:乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) 作者:weba ...
- 设计模式 装饰模式(Decorator)
设计模式 装饰模式(Decorator) @author ixenos 装饰模式是什么 1.装饰模式以对客户端透明的方式对象的功能,是继承关系的一个替代方案,但装饰模式可以在不创造更多子类的情况下,对 ...
- 设计模式-装饰模式(Decorator Pattern)
装饰模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活
- Netty学习-IO体系架构系统回顾 & 装饰模式Decorator的具体使用
Netty学习-IO体系架构系统回顾 IO和NIO的学习 NIO - 1.4 开始出的 在网络应用框架中,NIO得到了大量的使用,特别是netty里面 前提:对IO及其了解 对IO的总结和回顾 理解J ...
- 设计模式-09装饰模式(Decorator Pattern)
1.模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制:使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是 ...
- 设计模式系列之装饰模式(Decorator Pattern)——扩展系统功能
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 装饰模式 - Decorator 和 外观模式 - Facade
装饰模式 Decorator,不改变接口但动态给对象加入责任,所需功能按顺序串联起来控制,比生成子类灵活. 外观模式 Facade,让接口更简单.为子系统中的一组接口提供一个一致的界面. 参考:
随机推荐
- float类型数保留一位小数
float类型数保留一位小数 float a = 2.5f; float b = 1.2f; System.out.println(a/b); System.out.println((float)(M ...
- 工具类TestTools
一些方法可能要使用到该工具类,该工具类中的方法包括从链接数据库到数据表中记录的增删改查. package JDBCTest; import java.io.InputStream; import ja ...
- spring cloud: 升级到spring boot 2.x/Finchley.RELEASE遇到的坑
spring boot2.x已经出来好一阵了,而且spring cloud 的最新Release版本Finchley.RELEASE,默认集成的就是spring boot 2.x,这几天将一个旧项目尝 ...
- 开源的.NET系统推荐
C# 源码 AForge.NET RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的 ...
- mod_wsgi的工作模式和配置
Openstack所有提供API接口的服务都是python web server,而其本身性能很弱,目前已经将它们配置到了apache上.但对于如何设置mod_wsgi的参数,我一直没有好好去阅读其文 ...
- Spark机器学习(3):保序回归算法
保序回归即给定了一个无序的数字序列,通过修改其中元素的值,得到一个非递减的数字序列,要求是使得误差(预测值和实际值差的平方)最小.比如在动物身上实验某种药物,使用了不同的剂量,按理说剂量越大,有效的比 ...
- Flume采集Nginx日志到HDFS
下载apache-flume-1.7.0-bin.tar.gz,用 tar -zxvf 解压,在/etc/profile文件中增加设置: export FLUME_HOME=/opt/apache-f ...
- Redis实战 内存淘汰机制
http://blog.720ui.com/2016/redis_action_02_maxmemory_policy/#volatile-lru 文章目录 1. 如何配置 2. 动态改配置命令 2. ...
- grep与孪生兄弟egrep差异
egrep是对grep的功能扩展,让其支持正则更加完美! #grep与egrep不同 egrep完全支持正则 ls |grep -i '[a-z]\{3\}' === ls |egrep -i ...
- EF+LINQ事物处理
在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作同一条数据的同一个字段的话, ...