显然设计模式往往追求开闭原则,所以往往是面向接口编程,那么万事万物就是先写接口,把需求弄出来,这里以一辆车子在陆地上跑为基础,对它进行装饰,使它可以具备更多的"功能",达到装饰的效果.这里由于代码相对简单,直接写在一个类里面了

package com.demo.decorator;/*** ICar:抽象构建,面向接口编程,不管三七二十一,来个接口明确要干什么哈* 就是实现一个毫无装饰的移动的功能** @author zhangxiaoxiang* @date 2019/8/9*/
public interface ICar {/*** 毫无装饰的陆地上跑的功能*/void move();
}/*** 具体构件角色(真实对象),接口迟早要用于实现的,那这里车就来实现车子移动的接口*/
class Car implements ICar {@Overridepublic void move() {System.out.println("陆地上跑!");}
}/*** Decorator装饰角色*/
class SuperCar implements ICar {/*** 子类需要使用,所以使用protected* 又是一个典型的接口做属性,典型的开闭原则*/protected ICar car;public SuperCar(ICar car) {this.car = car;}/*** 原功能两保留*/@Overridepublic void move() {car.move();}
}/*** ConcreteDecorator具体装饰角色*/
class FlyCar extends SuperCar {public FlyCar(ICar car) {super(car);}/*** 这里进行装饰功能*/public void fly() {System.out.println("天上飞!");}@Overridepublic void move() {super.move();//拓展功能,装饰fly();}}/*** ConcreteDecorator具体装饰角色*/
class WaterCar extends SuperCar {public WaterCar(ICar car) {super(car);}/*** 这里进行装饰功能*/public void swim() {System.out.println("水上游!");}@Overridepublic void move() {super.move();//拓展功能,装饰swim();}}/*** ConcreteDecorator具体装饰角色*/
class AICar extends SuperCar {public AICar(ICar car) {super(car);}/*** 这里进行装饰功能*/public void autoMove() {System.out.println("自动跑!");}@Overridepublic void move() {super.move();//拓展功能,装饰autoMove();}}

再测试一下

package com.demo.decorator;/*** Client:装饰器测试** @author zhangxiaoxiang* @date 2019/8/9*/
public class Client {public static void main(String[] args) {System.out.println("------------------来一个常规无装饰的操作------------------------");Car car = new Car();car.move();System.out.println("------------------增加新的功能,飞行---------------------------");FlyCar flycar = new FlyCar(car);flycar.move();System.out.println("------------------增加新的功能,水里游--------------------------");WaterCar waterCar = new WaterCar(car);waterCar.move();System.out.println("------------------增加两个新的功能,飞行,水里游-----------------");//这里也可以叫包装2下WaterCar waterCar2 = new WaterCar(new FlyCar(car));waterCar2.move();//       JDK使用装饰器,下面的写法是不是很熟悉
//      Reader r = new BufferedReader(new InputStreamReader(new FileInputStream(new File("d:/a.txt"))));}
}

测试结果

java设计模式之装饰器模式(包装器模式)相关推荐

  1. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  2. Java设计模式之行为型:责任链模式

    背景: 学校规定参加校招的同学必须要请假,且要有相关人员的签字,三天以下需辅导员签字.三到七天需要系主任签字,一个星期以上需要院长签字,更多的则需要校长签字! 上图将学生.辅导员.系主任.院长.校长组 ...

  3. Java设计模式之结构型:享元模式

    一.什么是享元模式: 享元模式通过共享技术有效地支持细粒度.状态变化小的对象复用,当系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量.比如说一个文本系 ...

  4. Java设计模式之行为型:中介者模式

     前言: 在我们的生活中处处充斥着"中介者",比如你租房.买房.找工作.旅游等等可能都需要那些中介者的帮助,地球上国与国之间的关系异常复杂,会因为各种各样的利益关系来结成盟友或者敌 ...

  5. 【每天一个java设计模式(二十三)】 - 访问者模式

    在访问者模式中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元素对象已接受访问者对象,这样访问者 ...

  6. 【每天一个java设计模式(十五)】 - 命令模式

    命令模式是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令. 命令模式也就是一个 ...

  7. 【每天一个java设计模式(十四)】 - 解释器模式

    解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文. 解释器模式主要包括以下几个部分: 抽象表达式角色:定义解释器的接口,约定解释 ...

  8. Java设计模式(7)装饰模式(Decorator模式)

    Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这 ...

  9. java设计模式之 装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...

  10. java设计模式之装饰器模式

    一.装饰器模式简介 装饰器模式可以动态给一个对象添加一些额外的职责,同时又不改变其结构.就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.这种模式创建了一个装饰 ...

最新文章

  1. Study on Android【四】--显示控件使用
  2. 文件逆序改为正序脚本
  3. Cloudera Enterprise 试用版 6.3.1查看cloudrea的许可证---可用期限
  4. 如何区分Oracle的数据库,实例,服务名,SID
  5. Java RMI(2):项目中使用RMI
  6. Lync2010服务器的高可用性部署测试
  7. 人生苦短快用python_人生苦短,快用 Python
  8. 从零实现循环神经网络
  9. 堆排序java语言描述
  10. html阻止超链接跳转,009_阻止html标签默认事件的执行,比如阻止超链接默认点击事件的执行...
  11. 线性代数知识点整理(自用)
  12. 图神经网络 图像处理,神经网络图像修复
  13. 软件工程:软件开发生命周期 (SDLC)
  14. 百度账号 不用手机号注册
  15. 怎样在html中设置首字母大写,css如何设置英文首字母大写
  16. Linux系统的注销与关闭
  17. 关于百度网盘下载过慢的解决方法
  18. 电脑使用技巧提升篇9:使用360压缩软件文件加密
  19. findx2鸿蒙系统,OPPO Find X2 Pro 官方降价 1000 华为全新系统来了
  20. 如何评估前端开发周期/排期?

热门文章

  1. uni-app 调用相机或相册图片并转为base64格式上传图片
  2. 不可不看,马化腾海量信息的内部分享
  3. bzoj 1597: [Usaco2008 Mar]土地购买(斜率优化dp 例题)
  4. python零基础cap_零基础学Python语言CAP
  5. 【小程序】已有公众号认证,一步一步申请小程序(图文)
  6. 《都挺好》一剧,除了气愤的苏大强,生活中还有多少苏明哲!
  7. Tomcat基础《三》----负载均衡
  8. excel宏(VB)常用保留字及关键字整理
  9. 树莓派体验13 - 树莓派3B板载wifi配置方法
  10. “科学法”让头条号涨粉10000加,可参考