首页 > 代码库 > 黑马程序员——装饰实际模式

黑马程序员——装饰实际模式

public class Demo5 {
动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
 
具体被装饰者和抽象装饰类都继承于抽象被装饰者类,继承的是类型,而不是行为。行为来自装饰者和基础组件,或与其他装饰者之间的组合关系。装饰者通常是用其他类似于工厂或生成器这样的模式创建的。
/**装饰实际模式:
 * 当想要对已有的对象进行功能增强时
 * 可以定义类,将已有对象传入,基于已有功能,并提供加强功能
 * 那么自定义的该类成为装饰类
 * 
 * 装饰类通常会通过构造方法接收被装饰的对象
 * 并基于被装饰的对象的功能,提供更强的功能
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
SuperPerson superPerson=new SuperPerson(p);
superPerson.supereat();
}
 
}
class Person
{
void eat(){
System.out.println("吃饭");
}
 
}
class SuperPerson
{
private Person p;
SuperPerson(Person p){
this.p=p;
}
public void supereat()
 
{
System.out.println("喝酒");
p.eat();
System.out.println("甜点");
}
 
}package Excr191;
 
import java.io.FileReader;
 
import org.omg.CORBA.PUBLIC_MEMBER;
 
/*
 * MyReader//专门用于读取数据的类
 *  |MyBufferTextReader
 *  |MyBufferMediaReader
 * 
 *  |MyBufferDateReader
 * class MyBufferReader
 * {
 * MyBufferReader(MyTextReader text)
 * MyBufferReader(MyMediaReader media)
 * }
 * 上述类 扩展性很差
 * 
 * 找其参数的共同类型,通过多态的形式,可以提高扩展性
 * class MyBufferREader extends MyReader
 * {
 * private MyReader r;
 * MyBufferReader(MY Reader r)
 * ()
 * }
 *  |MyMediaReader
 *  |MyBufferReader
 *  
 *  装饰模式比继承要灵活,避免了继承体系臃肿
 *  而且降低了类与类之间的关系
 *  
 *  装饰类 因为是增强已有对象,具备的功能和已有的是相同点,
 *  只不过提供了更强的功能,所以装饰类和被装饰类通常都属于一个体系中
 *  
 *  
 * 
 * */
public class Demo6 {
 
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
 
}
 
}
class MyBufferedReader
{
private FileReader reader;
public MyBufferedReader(FileReader reader) {
this.reader=reader;
// TODO Auto-generated constructor stub
}
 
//可以一次读一行数据的方法
public String myReadLine(){
return null; 
//定义一个临时容器,元BufferReader封装的字符数组
//为了演示方便,定义一个StringBuiler容器,因为最终还要把数据编程字符串
StringBuilder sBuilder=new StringBuilder();
int ch=0;
while((ch=reader.read())!=-1){
if (ch==‘\r‘) {
continue;
if (ch==‘\n‘) {
return sBuilder.toString();
}else 
sBuilder.append((char)ch);
}
 
if (sBuilder.length()!=0) {
return sBuilder.toString();
return null;}
}}}
 
/*覆盖Reader类中的抽象方法
 * 
 * 
 * 
 * */
 package Excr191;
 
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
 
public class Demo7 {
 
/**
 * @param args
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileReader fileReader =new FileReader("D://1");
LineNumberReader lineNumberReader=new LineNumberReader(fileReader);
String lineString=null;
while ((lineString=lineNumberReader.readLine())!=null) {
System.out.println(lineNumberReader.getLineNumber()+lineString);
}
lineNumberReader.close();
}
 
}
package Excr191;
 
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
 
public class Demo8 {
 
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileReader fileReader=new FileReader("D://demo.txt");
MyLineNumberReader myLineNumberReader=new MyLineNumberReader(fileReader);
String lineString=null;
while ((lineString=myLineNumberReader.myReadLine())!=null) {
System.out.println(lineString);
}
myLineNumberReader.myClose();
}
 
}
class MyLineNumberReader
{
private Reader reader;
private int lineNumber;
public MyLineNumberReader(Reader reader) {
// TODO Auto-generated constructor stub
}
public String myReadLine() throws IOException
{ lineNumber++;
StringBuilder stringBuilder=new StringBuilder();
int ch=0;
while ((ch=reader.read())!=-1) {
if (ch==‘\r‘) 
continue;
if (ch==‘\n‘) 
return stringBuilder.toString();
else 
{stringBuilder.append((char)ch);
}
if(stringBuilder.length()!=0)
return stringBuilder.toString();
return null;
}
return null;
}
 
 
public void setLineNumber (int lineNumber) 
{
this.lineNumber=lineNumber;
}
public int getLineNumber()
{
 return lineNumber;
}
public void myClose() throws IOException{
reader.close();
}
}
 
 

详情请查看:http://edu.csdn.net/heima

黑马程序员——装饰实际模式