java设计模式4-装饰者模式
什么是装饰者模式?
在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
重点理解一句话:动态的扩展一个对象的功能.
我理解的装饰者模式:把一个东西用另一个东西来包装一下,以增加这个东西本身的功能.
装饰者与继承的不同点.
Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。
装饰者模式设计原则(了解):
1,多用组合,少用继承.
利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为.然而,如果有组合的做法扩展对象的行为,就可以运行进动态地进行扩展.
在前面提到策略模式中也提到了,多用组合.那么策略模式装饰者有什么不一样的呢?
1,装饰对象包含一个真实对象的引用,而策略模式里面持有的是同一类行为接口的引用.传入的时候是传入接口的实现类.
2,类设计应该对扩展开放,对修改关闭.
什么情况下要用装饰者模式.
要添增加一个类的功能的时候,不能改变这个类的代码.
javaIO典型的装饰者模式理解.
超类输入流:InputStream
两个分支:
1个是主体的分支.FileInputStrean,StringBufferInputString,ByteArrayInputStrean.
2,装饰者中间层,FilterInpuStrean
BufferInputStrean DataInputStream LineNumberInputStrean
现在我们要自己的扩展一个装饰者模式,大所有小写自动转成大写的流UpperCaseInputStream.
package com.java.jikexueyuan.myiodecorator;import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; //直接继承分支的中间层. //因为分支的中间层已为我们设计好超类的引用 public class UpperCaseInputStream extends FilterInputStream{//构造方法里面传入protected UpperCaseInputStream(InputStream in) {//可以用super是因了,FilterInputStream是一个分支的中间层super(in); }//写自己的方法public int read() throws IOException{int c=super.read();return c==-1?c:Character.toUpperCase((char)(c));}public int read(byte[] b,int offset,int len) throws IOException{int result=super.read(b,offset,len);for(int i=0;i<result;i++){b[i]=(byte)Character.toUpperCase((char)(b[i]));}return result;} }
记住一点,每一个分支都要有中间成.用在作为装饰者类里面的引用
装饰者模式怎么设计
1,有一个抽象的超类,里面有抽象的方法,和一些共有属性字段信息.
2,然后就是主体部分,主体部分可以理解成抽象超类的子类.主体类可以有一个中间层.
//这是那个超类 public abstract class Animal {//这是共有属性public String language;//get/set//共有的方法public abstract String Speak();}//这个类就是那个中间层(这一层也可以省略) public class Human extends Animal {@Overridepublic String Speak() {return super.language;}} //这是主体分支,就是超类的子类.当然还可以扩展出很子类出来.只举一个例子. public class Chinese extends Human {public Chinese(){super.language="汉语";}//这里是可以直接继承了Human类的Speak方法的.就要以不用在写了 }
下面才是真正的装饰者的部分:
1,同样要有一个中间层,(重点),主要就是这个中间层的设计.
2,直接分支--直接改写方法,或添加方法.
3,中间层这个类里面有一个超类的引用,通过构造方法传入(重点).
中间层类直接 继承超类,里面有一个超类的引用从构造方法传入.
然后就是一些自己的方法.
要装饰的类直接继承这个中间者类.
//功夫就是这个中间成. public class Gongfu extends Animal{Animal animal;Gongfu(Animal animal) {this.animal=animal; }public void gongfu(){System.out.println("这个人会功夫");}是间层里面不用改变的方法直接调用父类来返回@Overridepublic String Speak() {return animal.Speak();} }//用功夫来装饰一个人 public class Taiji extends Gongfu {//这个会自动生成,因为Gongfu没有无参的构造方法 Taiji(Animal animal) {super(animal);}public void taiji(){System.out.println("这个人会taiji");} }
这个代码有一点问题,没有时间去思考了.但是装饰者的大体思想这样.
转载于:https://www.cnblogs.com/yinyu/p/5276694.html
java设计模式4-装饰者模式相关推荐
- Java设计模式(装饰者模式-组合模式-外观模式-享元模式)
Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...
- Java 设计模式之装饰者模式
一.了解装饰者模式 1.1 什么是装饰者模式 装饰者模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰者来包裹真实的对象. 所以装饰者可以动 ...
- Java设计模式之三--装饰者模式
转载出处:http://blog.csdn.NET/lmj623565791/article/details/24269409 今天继续设计模式之旅,给大家带来装饰者模式,国际惯例,先看定义. 装饰者 ...
- (设计模式七)java设计模式之装饰器模式
一.简介: 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类 ...
- java设计模式之 装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...
- java设计模式之装饰器模式
一.装饰器模式简介 装饰器模式可以动态给一个对象添加一些额外的职责,同时又不改变其结构.就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.这种模式创建了一个装饰 ...
- Java 设计模式之装饰器模式
装饰器模式用于给原有对象增加新功能的场景, 拿食物冰淇淋,香草巧克力作为例子,给冰淇淋加香草,或者加巧克力,或者加香草和巧克力. 首先定义一个食物接口: /*** 装饰类和被装饰类共同继承的抽象类* ...
- java设计模式之装饰者模式
为什么80%的码农都做不了架构师?>>> 定义:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 特点: ...
- java与模式孙悟空_由孙悟空的七十二变看Java设计模式:装饰者模式
应用场景 京东.天猫双十一,情人节商品大促销,各种商品有不同的促销活动 满减:满200减50 每满减:每满100减10 打折:买两件8折,三件7折 数量减:满三件减去最低价的一件 假设现在顾客买了两件 ...
- java设计模式之装饰器模式(包装器模式)
显然设计模式往往追求开闭原则,所以往往是面向接口编程,那么万事万物就是先写接口,把需求弄出来,这里以一辆车子在陆地上跑为基础,对它进行装饰,使它可以具备更多的"功能",达到装饰的效 ...
最新文章
- 创建SSIS包—循环和动态package
- FRM-40212: set_item_property:ITEM_IS_VALID
- mysql退出当前数据库,再次 show databases
- New Year and the Christmas Ornament
- javascript实用技巧--数组.
- java关键字整理_【java基础知识整理】java基础语法之关键字
- Linux 禁用msi模式,通过禁用MSI模式解决Win10磁盘占用100%的方法
- Node.js开发之Express框架安装
- python 求子字符串_求子串-KPM模式匹配-NFA/DFA
- DIY高清云台(吊舱)方案
- 【MYSQL快速入门】常用函数:日期函数
- vscode 分析c代码_vs code(C语言)配置教程
- 计算机无法读取手机内存,手机sd卡无法读取,教您解决手机sd卡无法读取的方法...
- 豆瓣top250html源码,用23行代码爬取豆瓣音乐top250
- 华东理工大学考研计算机难度,华东理工大学(专业学位)计算机技术考研难吗
- 龙门架式焊接机器人_一种龙门架式焊接机械手的制作方法
- 解决 Missing GL version
- pmp错题集2(强化二)
- 专访凌云光技术3D视觉业务部经理李淼:做好技术和产品,为VR行业服务
- uni-app锚点跳转及滚动Tab切换(非scroll-view)
热门文章
- 线程池(ThreadPoolExecutor ) 的 创建、关闭、监控
- linux dd后无法启动盘,dd后新盘系统无法启动,解决(上)
- 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_03-项目概述-技术架构...
- mybatis使用collection查询集合属性规则
- appium手机键盘实现方法
- Java空字符串与null区别
- 查看Linux占用内存/CPU最多的进程
- HAProxy从零开始到掌握
- 【bzoj5166】[HAOI2014]遥感监测 贪心
- linux pmap命令