版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第八章第八章 装饰模式装饰模式 2022-3-251装饰模式(别名:包装器)装饰模式(别名:包装器) 动态地给对象添加一些额外的职责。就功能来说装饰动态地给对象添加一些额外的职责。就功能来说装饰模式相比生成子类更为灵活。模式相比生成子类更为灵活。Decorator Pattern(Another Name: Wrapper) Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending func
2、tionality.一一 、 概述概述 2022-3-253 装饰模式是动态地扩展一个对象的功能,而装饰模式是动态地扩展一个对象的功能,而不需要改变原始类代码的一种成熟模式。在装饰不需要改变原始类代码的一种成熟模式。在装饰模式中,模式中,“具体组件具体组件”类和类和“具体装饰具体装饰”类是该类是该模式中的最重要的两个角色。模式中的最重要的两个角色。 二、二、装饰模式模式的结构与使用装饰模式模式的结构与使用 2022-3-254装饰模式的结构中包括四种角色:装饰模式的结构中包括四种角色: 抽象组件(抽象组件(ComponentComponent) 具体组件(具体组件(ConcreteCompon
3、entConcreteComponent) 装饰(装饰(DecoratorDecorator) 具体装饰(具体装饰(ConcreteDecotatorConcreteDecotator) 2022-3-255装饰模式的装饰模式的UMLUML类图类图 装饰模式的结构的描述与使用装饰模式的结构的描述与使用 假设系统中有一个Bird抽象类以及Bird类的一个子类Sparrow。Sparrow类实现了Bird类的fly方法,使得Sparrow类创建的对象(麻雀)调用fly方法能连续飞行100米。 现在,用户需要两只鸟,无论哪种鸟都可以,但必须分别能连续飞行150米和200米。2022-3-2571 1
4、抽象组件抽象组件 : : Bird.java Bird.java public abstract class Birdpublic abstract class Bird public abstract int public abstract int fly(); fly(); 2022-3-2582 2具体组件具体组件 : : Sparrow.java Sparrow.java public class Sparrow extends Birdpublic class Sparrow extends Bird public final int public final int DISTANC
5、E=100; DISTANCE=100; public int public int fly() fly() return DISTANCE; return DISTANCE; 2022-3-2593 3装饰装饰 (DecoratorDecorator): : Decorator.java Decorator.java public abstract class Decorator extends Birdpublic abstract class Decorator extends Bird protected Bird bird; protected Bird bird; public D
6、ecorator() public Decorator() public Decorator(Bird bird) public Decorator(Bird bird) this.bird=bird; this.bird=bird; 2022-3-25104 4具体装饰(具体装饰(ConcreteDecotatorConcreteDecotator): : SparrowDecorator.javaSparrowDecorator.java public class SparrowDecoratorpublic class SparrowDecorator extends Decorator
7、 extends Decorator public final int DISTANCE=50; /eleFly public final int DISTANCE=50; /eleFly方法能飞方法能飞5050米米 SparrowDecorator(BirdSparrowDecorator(Bird bird) bird) super(bird); super(bird); public int public int fly() fly() int int distance=0; distance=0; distance=bird.fly()+eleFly distance=bird.fly
8、()+eleFly(); (); return distance; return distance; private int eleFly private int eleFly() /() /装饰者新添加的方法装饰者新添加的方法 return DISTANCE;return DISTANCE; 2022-3-25115 5应用应用 Application.javaApplication.java public class Applicationpublic class Application public void needBird(Bird public void needBird(Bird
9、 bird) bird) int flyDistance int flyDistance=bird.fly();=bird.fly(); System.out.println System.out.println(这只鸟能飞行这只鸟能飞行+flyDistance+flyDistance + +米米); ); public static void main(String args public static void main(String args) Application client=new Application (); Application client=new Applicatio
10、n (); Bird sparrow=new Sparrow(); Bird sparrow=new Sparrow(); Bird sparrowDecorator1= Bird sparrowDecorator1= new SparrowDecorator(sparrow new SparrowDecorator(sparrow); ); Bird sparrowDecorator2= Bird sparrowDecorator2= new SparrowDecorator(sparrowDecorator1); new SparrowDecorator(sparrowDecorator1
11、); client.needBird(sparrowDecorator1); client.needBird(sparrowDecorator1); client.needBird(sparrowDecorator2); client.needBird(sparrowDecorator2); 三、三、装饰模式的优点装饰模式的优点 2022-3-2512 被装饰者和装饰者是松耦合关系。由于装饰(被装饰者和装饰者是松耦合关系。由于装饰(DecoratorDecorator)仅仅依赖于抽象组件(仅仅依赖于抽象组件(ComponentComponent),因此具体装饰只知道),因此具体装饰只知道它要装
12、饰的对象是抽象组件的某一个子类的实例,但不需要它要装饰的对象是抽象组件的某一个子类的实例,但不需要知道是哪一个具体子类。知道是哪一个具体子类。 装饰模式满足装饰模式满足“开开- -闭原则闭原则”。不必修改具体组件,就可。不必修改具体组件,就可以增加新的针对该具体组件的具体装饰。以增加新的针对该具体组件的具体装饰。 可以使用多个具体装饰来装饰具体组件的实例。可以使用多个具体装饰来装饰具体组件的实例。四、Java IO与装饰模式 Java.io包的设计使用了装饰模式。 Reader、FileReader、BufferedReader类的关系符合装饰模式的结构。public final class
13、AccessTextFile /* * 1. 演示将流中的文本读入一个 StringBuffer 中 * throws IOException */ public void readToBuffer(StringBuffer buffer, InputStream is) throws IOException String line; / 用来保存每行读取的内容 BufferedReader reader = new BufferedReader(new InputStreamReader(is); line = reader.readLine(); / 读取第一行 while (line !
14、= null) / 如果 line 为空说明读完了 buffer.append(line); / 将读到的内容添加到 buffer 中 buffer.append(n); / 添加换行符 line = reader.readLine(); / 读取下一行 /* * 2. 演示将 StringBuffer 中的内容读出到流中 */ public void writeFromBuffer(StringBuffer buffer, OutputStream os) / 用 PrintStream 可以方便的把内容输出到输出流中 / 其对象的用法和 System.out 一样 / (System.ou
15、t 本身就是 PrintStream 对象) PrintStream ps = new PrintStream(os); ps.print(buffer.toString(); /* * 3. 调用 copyStream(InputStream, OutputStream) 方法拷贝文本文件 */ public void copyTextFile(String inFilename, String outFilename) throws IOException / 先根据输入/输出文件生成相应的输入/输出流 InputStream is = new FileInputStream(inFile
16、name); OutputStream os = new FileOutputStream(outFilename); copyStream(is, os); / 用 copyStream 拷贝内容 is.close(); / is 是在这里打开的,所以需要关闭 os.close(); / os 是在这里打开的,所以需要关闭 public static void main(String args) throws IOException int sw = 1; / 三种测试的选择开关 AccessTextFile test = new AccessTextFile(); switch (sw)
17、case 1: / 测试读 InputStream is = new FileInputStream(E:test.txt); StringBuffer buffer = new StringBuffer(); test.readToBuffer(buffer, is); System.out.println(buffer); / 将读到 buffer 中的内容写出来 is.close(); break; case 2: / 测试写 StringBuffer buffer = new StringBuffer(Only a testn); test.writeFromBuffer(buffer
18、, System.out); break; case 3: / 测试拷贝 test.copyTextFile(E:test.txt, E:r.txt); break; 五、应用举例-读取单词表/Word.txtarrangeexampleintelligence/chinese.txt整理例子智力/englishSentence.txtarrange tools in ordercite an example in pointan intelligence test/ ReadWord.javaimport java.io.*;import java.util.ArrayList;public
19、 abstract class ReadWord public abstract ArrayList readWord(File file);/ ReadEnglishiWord.javaimport java.io.*;import java.util.ArrayList;public class ReadEnglishiWord extends ReadWord public ArrayList readWord(File file) ArrayList wordList=new ArrayList(); try FileReader inOne=new FileReader(file);
20、 BufferedReader inTwo= new BufferedReader(inOne); String s=null; while(s=inTwo.readLine()!=null) wordList.add(s); inTwo.close(); inOne.close(); catch(IOException exp) System.out.println(exp); return wordList; /Decorator.javapublic abstract class Decorator extends ReadWord protected ReadWord reader;
21、public Decorator() public Decorator(ReadWord reader) this.reader=reader; / WordDecorator.javapublic class WordDecorator extends Decorator File decoratorFile; WordDecorator(ReadWord reader,File decoratorFile) super(reader); this.decoratorFile=decoratorFile; public ArrayList readWord(File file) ArrayL
22、ist wordList=reader.readWord(file); try FileReader inOne=new FileReader(decoratorFile); BufferedReader inTwo= new BufferedReader(inOne); String s=null; int m=0; while(s=inTwo.readLine()!=null) String word=wordList.get(m); word=word.concat( | +s); wordList.set(m,word); m+; if(mwordList.size() break;
23、inTwo.close(); inOne.close(); catch(IOException exp) System.out.println(exp); return wordList; import java.util.ArrayList;import java.io.File;public class Application public static void main(String args) ArrayList wordList=new ArrayList(); ReadEnglishiWord REW=new ReadEnglishiWord(); WordDecorator W
24、D1=new WordDecorator(REW,new File(chinese.txt); ReadWord reader=WD1; wordList=reader.readWord(new File(word.txt); for(int i=0;iwordList.size();i+) System.out.println(wordList.get(i); WordDecorator WD2=new WordDecorator(WD1,new File(englishSentence.txt); reader=WD2; wordList=reader.readWord(new File(
25、word.txt); for(int i=0;iwordList.size();i+) System.out.println(wordList.get(i); 六、应用举例(二)public abstract class Decorator /* The method places each decorative item* on the tree.*/public abstract void place(Branch branch);public class ChristmasTree private Branch branch; public Branch getBranch() return branch; public class BallDecorator extends Decorator / Default Constructorpublic BallDecorator(ChristmasTree tree) Branch branch = tree.getBranch(); place(branch); /* The method places each
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024三个小孩抚养权协议及共同财产分割合同6篇
- 2025年服装机械项目申请报告模板
- 2024-2025学年新疆维吾尔阿勒泰地区数学三上期末统考模拟试题含解析
- 2024-2025学年武功县数学三年级第一学期期末联考试题含解析
- 去工厂实习报告模板十篇
- 2024年消防喷淋安装施工总承包合同文件
- 超市的实习报告四篇
- 2025年伺服系统项目申请报告模稿
- 2025年咖啡机项目规划申请报告
- 2024年度水电供应专用合同合同一
- 《正态分布理论及其应用研究》4200字(论文)
- GB/T 45086.1-2024车载定位系统技术要求及试验方法第1部分:卫星定位
- 支气管动脉造影护理
- 1古诗文理解性默写(教师卷)
- 广东省广州市越秀区2021-2022学年九年级上学期期末道德与法治试题(含答案)
- 校园春季安全
- 2024-2025学年六上科学期末综合检测卷(含答案)
- 【MOOC】工程力学-浙江大学 中国大学慕课MOOC答案
- 在线教育平台合作合同助力教育公平
- 2024年湖南省公务员考试《行测》真题及答案解析
- 产房年终总结及明年计划
评论
0/150
提交评论