一、概念

我们在使用以前既定的类或者使用别人使用的类的时候,如果该类的方法,不满足你的需求的时候,需要你进行额外附加功能的时候,往往我们想到的方法是继承实现,

但是继承会导致类的越来越庞大,有什么好的方法呢?装饰者模式(也称静态代理)。

就是在不破坏原类的结构的基础上,对现有类附件额外功能。

条件:

1 )继承同一个类或者实现同一个接口。

2)装饰者要有被装饰者的引用。

3)需要增强的方法,对其增强,不需要增强的方法调用原先的方法。

例子:

共同继承的接口:

 package com.jd.dec;

 /**
* 1)接口不能实例化。
* 2)接口没有构造方法。
* 3)接口所有的方法都是抽象方法。
* 4)接口没有成员变量只有final和static。
* 5)接口的方法没有方法体。
* 6)接口不是被类继承而是被类实现。
* 7)接口可以实现多继承。
*/
public interface Car {
void run();
void stop();
}

被装饰者:

 package com.jd.dec;

 public class qq  implements  Car{
public void run(){
System.out.println("正在行驶");
};
public void stop(){
System.out.println("停车");
}; }

装饰者:

 package com.jd.dec;

 public class binli implements  Car {
private Car car;
public binli(Car car){
this.car=car;
}//对被装饰者的引用,注意这里不写qq而是写的是Car 是指对一类的Car进行增强而不是单单qq。
public void run(){
System.out.println("提速200");//需要增强的方法
};
public void stop(){
this.car.stop();
};
}

这样我可以直接调用 新类的binli对象就可以,加强原先的car类的职责。

java 装饰者模式的更多相关文章

  1. java装饰者模式理解

    java 装饰者模式其实就是扩展子类的功能,和继承是一个性质. 但继承是在编译时就固定扩展了父类的一些功能,而装饰者模式是在运行过程中动态绑定对象,实现一个子类可以随时扩展功能. 将方法排列组合,也可 ...

  2. java 装饰者模式与继承的区别

    装饰者模式目标 把许多要实现的功能,加载在子类上,类的继承,显得很臃肿,装饰着模式是在不改变原有类文件和使用继承的情况下,通过创建一个包装对象动态地扩展一个对象的功能,相比生成子类更为灵活 装饰者模式 ...

  3. JAVA装饰器模式

    Java程序员们应该对java.io对不会陌生,因为java.io包采用了装饰器模式. 一.定义: Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样 ...

  4. Java 装饰器模式详解

    转载请注明出处:http://blog.csdn.net/zhaoyanjun6/article/details/56488020 前言 在上面的几篇文章中,着重介绍了Java 中常见的 IO 相关知 ...

  5. Java装饰者模式(Decorator)

    一.定义 装饰模式的设计理念主要是以对客户端透明的方式动态扩展对象的功能,是继承关系的一个替代(继承会产生大量的子类,而且代码有冗余).装饰模式可以在不创造更多子类的情况下,将对象的功能加以扩展.装饰 ...

  6. JAVA装饰者模式(从现实生活角度理解代码原理)

    装饰者模式可以动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 该模式的适用环境为: (1)在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职 ...

  7. Java装饰者模式(思维导图)

    图1 装饰者模式[点击查看图片] 1,一个简单的以人为主体的装饰者模式 被装饰者 public interface Human {//被装饰者 public void wearClothes(); p ...

  8. java 装饰器模式实现代码

    目录 1.实现装饰器模式 1.1.公共接口 1.2.接口实现 1.3.装饰器 1.4.装饰构件 1.5.测试装饰器 上图展示的是io流中的一个装饰者模式的代码结构 1.实现装饰器模式 汽车厂生产汽车实 ...

  9. Java装饰者模式

    定义:在不改变原有对象的基础上,将功能附加到对象自上 提供了比继承更有弹性的替代方案(扩展原有对象功能) 类型:结构型 扩展一个类的功能或给一个类添加附加职责 动态的给一个对象添加功能,这些功能可以再 ...

随机推荐

  1. 解决 ImportError: cannot import name pywrap_tensorflow

    原文:https://aichamp.wordpress.com/2016/11/13/handeling-importerror-cannot-import-name-pywrap_tensorfl ...

  2. “使用IDEA,配置文件是yml,无法获取[环境变量],值是null”的问题处理

    为了便于隐藏用户名和密码,我们有时会用到“环境变量”. Spring Boot提供了很好的机制,可以在配置文件中,如application.yml书写以下格式,然后在代码中@Value就可以获取“环境 ...

  3. 仿ElementUI构建自己的Vue组件库用babel-plugin-component按需加载组件及自定义SASS主题

    最近使用ElementUI做项目的时候用Babel的插件babel-plugin-component做按需加载,使得组件打包的JS和CSS包体积大大缩小,加载速度也大大提升,所有想模仿做一个组件库也来 ...

  4. Maven项目下启动后Eclipse报错:org.springframework.web.context.ContextLoaderListener

    严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderLis ...

  5. Python中操作HTTP请求的urllib模块详解

    urllib 是 Python 标准库中用于网络请求的库.该库有四个模块,分别是urllib.request,urllib.error,urllib.parse,urllib.robotparser. ...

  6. BZOJ4566: [Haoi2016]找相同字符(后缀自动机)

    题意 题目链接 Sol 直接在SAM上乱搞 枚举前缀,用SAM统计可以匹配的后缀,具体在匹配的时候维护和当前节点能匹配的最大值 然后再把parent树上的点的贡献也统计上,这部分可以爆跳parent树 ...

  7. java多线程3种方式

    Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...

  8. Python 利用Python编写简单网络爬虫实例2

    利用Python编写简单网络爬虫实例2 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://www.51testing. ...

  9. redis介绍(2)简单安装

    我分两种方式讲解 window 下载地址:https://github.com/MSOpenTech/redis/releases. Redis 支持 32 位和 64 位.这个需要根据你系统平台的实 ...

  10. KT_登录_流程图

    一.需求 关于系统登录功能,需求如下:1.登录需要输入用户名.密码2.如果连续密码输入错误4次,则自动锁定账号5分钟(也就是说5分钟之内不能再登录) 请根据以上需求,画一个登录操作流程图 二.绘图 版 ...