今天我们学习了装饰模式
安装模式举例:
M
|--M1
|--M2
|--M3
A B : new M2(M1)
A C : new M3(M1)
B C : new M3(M2)
A B C : new M3(M2(M1))
MP3实现的功能:
class Program
{
static void Main(string[] args)
{
IUSB mp3player = new MP3Player(); //只能读写数据的mp3
MusicPlayer player= new MusicPlayer(mp3player); //装饰音乐播放
player.ReadData();
player.WriteData();
player.PlayMusic(); //具有播放音乐的功能
Camera mp3Carm = new Camera(player);
mp3Carm.TakePhotoes(); //具有照相的功能
Console.ReadKey();
}
}
装饰模式总结
装饰模式是为已有的功能动态地添加更多功能的一种方式。
当系统需要新功能的时候,若向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为,但这种做法的问题在于,它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要。而装饰模式切提供了一个非常好的解决方案,他把每个要装饰的功能都放在单独的类中,并让这个类包装他所要装饰的对象,因此,当需要执行特殊行为时,客户端代码就可以在运行时更具需要有选择地、顺序地使用装饰功能包装对象了。
适用性
在以下情况下应当使用装饰模式:
1.需要扩展一个类的功能,或给一个类增加附加责任。
2.需要动态地给一个对象增加功能,这些功能能再动态地撤销。
3.需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。
字符流:
Reader中的常见的方法:
1,int read():读取一个字符。返回的是读到的那个字符。如果读到流的末尾,返回-1.
2,int read(char[]):将读到的字符存入指定的数组中,返回的是读到的字符个数,
也就是往数组里装的元素的个数。如果读到流的末尾,返回-1.
3,close():读取字符其实用的是window系统的功能,就希望使用完毕后,进行资源的释放。
Writer中的常见的方法:
1,write(ch): 将一个字符写入到流中。
2,write(char[]): 将一个字符数组写入到流中。
3,write(String): 将一个字符串写入到流中。
4,flush():刷新流,将流中的数据刷新到目的地中,流还存在。
5,close():关闭资源:先关闭前会先调用flush,刷新流中的数据去目的地。然流关闭。
FileWriter:
该类没有特有的方法。只有自己的构造函数。
该类特点在于,
1,用于处理文本文件。
2,该类中有默认的编码表,
3,该类中有临时缓冲。
构造函数:在写入流对象初始化时,必须要有一个存储数据的目的地。
FileWriter(String filename):
该构造函数做了什么事情呢?
1,调用系统资源。
2,在指定位置,创建一个文件。
注意:如果该文件已存在,将会被覆盖。
FileWriter(String filename,boolean append):
该构造函数:当传入的boolean类型值为true时,会在指定文件末尾处进行数据的续写。
FileReader:
1,用于读取文本文件的流对象。
2,用于关联文件文件。
构造函数:在读取流对象初始化的时候,必须要指定一个被读取的文件。
如果该文件不存在会发生FileNotFoundException.
FileReader(String filename);