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");}
}

这个代码有一点问题,没有时间去思考了.但是装饰者的大体思想这样.

posted on 2016-03-14 18:33 不见不散789 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/yinyu/p/5276694.html

java设计模式4-装饰者模式相关推荐

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

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

  2. Java 设计模式之装饰者模式

    一.了解装饰者模式 1.1 什么是装饰者模式 装饰者模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰者来包裹真实的对象. 所以装饰者可以动 ...

  3. Java设计模式之三--装饰者模式

    转载出处:http://blog.csdn.NET/lmj623565791/article/details/24269409 今天继续设计模式之旅,给大家带来装饰者模式,国际惯例,先看定义. 装饰者 ...

  4. (设计模式七)java设计模式之装饰器模式

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

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

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

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

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

  7. Java 设计模式之装饰器模式

    装饰器模式用于给原有对象增加新功能的场景, 拿食物冰淇淋,香草巧克力作为例子,给冰淇淋加香草,或者加巧克力,或者加香草和巧克力. 首先定义一个食物接口: /*** 装饰类和被装饰类共同继承的抽象类* ...

  8. java设计模式之装饰者模式

    为什么80%的码农都做不了架构师?>>>    定义:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 特点: ...

  9. java与模式孙悟空_由孙悟空的七十二变看Java设计模式:装饰者模式

    应用场景 京东.天猫双十一,情人节商品大促销,各种商品有不同的促销活动 满减:满200减50 每满减:每满100减10 打折:买两件8折,三件7折 数量减:满三件减去最低价的一件 假设现在顾客买了两件 ...

  10. java设计模式之装饰器模式(包装器模式)

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

最新文章

  1. 创建SSIS包—循环和动态package
  2. FRM-40212: set_item_property:ITEM_IS_VALID
  3. mysql退出当前数据库,再次 show databases
  4. New Year and the Christmas Ornament
  5. javascript实用技巧--数组.
  6. java关键字整理_【java基础知识整理】java基础语法之关键字
  7. Linux 禁用msi模式,通过禁用MSI模式解决Win10磁盘占用100%的方法
  8. Node.js开发之Express框架安装
  9. python 求子字符串_求子串-KPM模式匹配-NFA/DFA
  10. DIY高清云台(吊舱)方案
  11. 【MYSQL快速入门】常用函数:日期函数
  12. vscode 分析c代码_vs code(C语言)配置教程
  13. 计算机无法读取手机内存,手机sd卡无法读取,教您解决手机sd卡无法读取的方法...
  14. 豆瓣top250html源码,用23行代码爬取豆瓣音乐top250
  15. 华东理工大学考研计算机难度,华东理工大学(专业学位)计算机技术考研难吗
  16. 龙门架式焊接机器人_一种龙门架式焊接机械手的制作方法
  17. 解决 Missing GL version
  18. pmp错题集2(强化二)
  19. 专访凌云光技术3D视觉业务部经理李淼:做好技术和产品,为VR行业服务
  20. uni-app锚点跳转及滚动Tab切换(非scroll-view)

热门文章

  1. 线程池(ThreadPoolExecutor ) 的 创建、关闭、监控
  2. linux dd后无法启动盘,dd后新盘系统无法启动,解决(上)
  3. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_03-项目概述-技术架构...
  4. mybatis使用collection查询集合属性规则
  5. appium手机键盘实现方法
  6. Java空字符串与null区别
  7. 查看Linux占用内存/CPU最多的进程
  8. HAProxy从零开始到掌握
  9. 【bzoj5166】[HAOI2014]遥感监测 贪心
  10. linux pmap命令