装饰模式(旧恋)「建议收藏」

装饰模式(旧恋)

大家好,又见面了,我是全栈君。

|–什么是装饰模式。

装饰模式:是你还是你,一切拜托你(借用老崔经典词)。

它是由继承出现的。先有继承,再有装饰。

回顾继承

    优点:提高复用性,让能够反复使用。通过方法重写利用后期扩展。

    坏处:因为类与类之间的继承关系。但他们关系增强。耦性也就高了。不符合java宗旨:低耦合。高内聚。

对照方下:

a:
有一个Witer体系


|–TxtWrite


|–Mp3Write


|–DIDWrite

上面是一个普通子类实现。调用者认为运行太慢,要求对三者进行增强(高效|缓冲)。改动例如以下

class myBuffereWrite exetends Write{
//接收子类:Fu f = new Zi();
private Write ziWrite;


public BuffereWrite(Write ziWrite)
{
this.ziWrite = ziWrite;
}
public void writeLine(String line)
{
//使用ziWrite进行整容处理。然后一行数据保存到write中。
}
public void close()
{
ziWrite.clese();//多态(调用的还是子类)!
}
public void flash(){
ziWrite.flash();//多态(调用的还是子类)。
}
....//重写Write的抽象方法。调用的myBuffereWrite中的,再方法里边调用是传送ziWrite。

仅仅只是在调用它之前给它做了一些手术。

}

|–总结

   1:比方你使用Write的高效功能,那你就创建myBuffereWrite,传递你的对其高效的对象,比方FileWrite();

   2:装饰模式体现了对一个对象(功能)的增强(高内聚),然后紧密性比較弱(低耦合)。

   3:JDK中用的装饰就挺多的,比方BufferedWriter(Writer out);PrintStream(OutputStream out);ObjectInputStream(InputStream in)等。

|–代码演示样例

  模拟BuffereReader装饰类

package com.Decoration;

import java.io.IOException;
import java.io.Reader;

/**
 * @author hubiao
 * 模拟BuffereReader装饰类
 *	
 *	分析:模拟一个类,就是自定一个类。实现它的特有方法:ReadLine();
 * 	  1:模拟什么:特有方法
 *        2:你有什么:依据装饰特点。自定的类继承一个抽象类,由于BuffereReader的readLine底层也是继承Reader中的。

* 我们要做的。也是继承Reader,写一个与BuffereReader一样的ReadLine方法来。 */public class MyBuffere extends Reader { /*Reader是一个抽象类的父类。将须要高效的类都实现了它。

都是它的子类。

*/ private Reader reader = null; public MyBuffere(Reader reader){ this.reader = reader; } public int read(char[] cbuf, int off, int len) throws IOException { return reader.read(cbuf, off, len); } public String readLine() throws IOException { /** * 1:这里要思考,使用 * A:read(char[] cbuf, int off, int len);一次读取一缓冲区 * B:read();//一次读取一个字符串 * 2:分析 * 我们模拟readLine目的是为了模拟什么?还不是为了实现BufferedReader中的readerLine一次读取一行的高效方法。 * 然后使用A方法不合适,由于它一次读取一个char容量定义的长度,我们封装好的代码非常难获知调用者要读取的数据文本的每行数据有多长。

* 使用B方法的优点,是一次读取一个字符,当遇到\r\n就说明是一行的结束。则说一行读取完成,那怎么一行的数据每一个字符用什么保存呢? * 使用String, 这...太可怕了吧。由于我们知道String在java中是一个常量池。

一但赋值,将不可变。

所以选择效率高的StringBuilder * 把每一个字符拼接到StringBuffer中。再返回给调用者。 */ //单字符容器 StringBuffer buffer = new StringBuffer(); //每一个字符 int read = 0; while((read = reader.read())!=-1) { char chr = (char) read; if(chr=='\r') continue; if(chr=='\n') return buffer.toString(); else buffer.append(chr); } //防止读取的是最后一行。则没有\r\n。那么再推断缓冲区中是否有值?假设有,则再返回。 if(buffer.length() > 0 ) return buffer.toString(); else return null; } public void close() throws IOException { reader.close(); }}


  模拟LineNumberReader

/**
 * @author hubiao
 *	模拟LineNumberReader
 *		也是相同,模拟,就是自定一个类,模拟需求给出的特殊方法:获取每一个行号,然后读取每一行。
 */
public class MyLineNumberReader extends Reader{

	/*接收传递子类对象,Fu f = new Zi();//多态*/
	private Reader reader;
	
	private int lineNumber;//行号
	
	public MyLineNumberReader(Reader reader) {
		this.reader = reader;
	}

	public int read(char[] cbuf, int off, int len) throws IOException {
		return reader.read(cbuf, off, len);
	}
	
	public String readLine() throws IOException
	{
		//单字符容器
		StringBuffer buffer = new StringBuffer();
		
		//每一个字符
		int read = 0;
		while((read = reader.read())!=-1)//-1表示读取到流的结尾!
		{
			char chr = (char) read;
			if(chr=='\r')
				continue;
			if(chr=='\n'){
				lineNumber++;
				return buffer.toString();
			}
			else
				buffer.append(chr);
		}
		
		//防止读取的是最后一行,则没有\r\n。那么再推断缓冲区中是否有值?假设有,则再返回。

if(buffer.length() > 0 ){ lineNumber++; return buffer.toString(); }else return null; } public void close() throws IOException { reader.close(); } public int getLineNumber() { return lineNumber; } public void setLineNumber(int lineNumber) { this.lineNumber = lineNumber; }}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115396.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java异常处理简单实例

    Java异常处理简单实例Java异常处理异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException的异常。异常发生的原因有很多,通常包含以下几大…

    2022年5月12日
    45
  • 安装VMware Tools选项显示灰色的正确解决办法

    安装VMware Tools选项显示灰色的正确解决办法百度了一天,重新安装了vm,在csdn逛了又逛,结合无数篇大神文章,最后自己成功琢磨出了真正能点亮灰色按钮的方法。简单实在,大神们的方法实在千秋万变,一个比一个复杂,最后只能实现成功拖拽,而复制粘贴却还是不行。首先问题如下:解决办法如下:1.关闭虚拟机;2.在虚拟机设置分别设置CD/DVD、CD/DVD2和软盘为自动检测三个步骤;3.再重启虚拟机,灰色字即点…

    2022年5月9日
    686
  • 字节跳动面经(一、二、三+大boss+hr面)

    字节跳动面经(一、二、三+大boss+hr面)先介绍一下,本科和研究生都不是计算机专业,现在是学通信,然后做图像处理,可能面试官看我不是科班出身没有问太多计算机相关的问题,因为第一次找工作,字节的游戏专场又是最早开始的,就投递了,投递的是游戏测试开发岗(非测试岗),字节是自己投的第一家公司,也是第一家笔试面试的公司,面试官应该都是上海部门的,三轮面试都是视频面,面试时间是从下午5:30到9:30,一共是四个小时多一点吧(含每轮之间的等待时间…

    2022年5月25日
    488
  • 怎么清除火狐浏览器的cookie?

    怎么清除火狐浏览器的cookie?

    2021年10月15日
    44
  • 数据库概念结构设计的方法和步骤_概念结构设计是整个数据库

    数据库概念结构设计的方法和步骤_概念结构设计是整个数据库概念结构设计什么是概念结构设计将需求分析得到的用户需求抽象为信息结构即概念模型的过程就是概念结构设计概念结构是各种数据模型的共同基础,它比数据模型更独立于机器、更抽象,从而更加稳定概念结构设计是整个数据库设计的关键概念结构设计的特点(1)能真实、充分地反映现实世界(2)易于理解(3)易于更改(4)易于向关系、网状、层次等各种数据模型转换

    2022年10月12日
    1
  • 北航计算机考研有多难_北京航空航天大学录取分数线2021

    北航计算机考研有多难_北京航空航天大学录取分数线2021文/最爱生活截止到现在,高考的志愿填报工作已经陆陆续续结束,各个高校也开始进行了录取工作。最近也有一部分省份开始公布了一些提前批次招录的投档分数线,同学们也将会陆陆续续的接受到自己理想中大学的录取通知书。目前,又有两个省份开始公布了本省份的提前批次投档分数线,分别是贵州省以及新疆维吾尔自治区。在这两个省份公布出提前批次的录取分数线之后,在网上也是一石激起千层浪,不少“惊喜”的事情也在发生,不少网友…

    2022年9月12日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号