黑马程序员
装饰和单例设计模式
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
一、装饰设计模式
当想对已有的对象进行功能增强时,可以自定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的类成为装饰类。装饰类通常会通过构造方法接收被装饰的对象。并基于被装饰的对象的功能,提供更强的功能。
继承与装饰的区别
当一个抽象类有很多的子类,需要为每个子类都增强一些功能时,如果为每一个子类都定义一个子类,会使继承体系变的相当复杂,而且不利于扩展,而如果是用装饰类的话,可以单独定义一个功能增强装饰类,将需要增强功能的子类传递进来就可以了,简化了继承体系, 装饰类比继承更灵活,降低了类与类之间的关系, 装饰类通常与被装饰类属于一个体系。
自定义一个字符缓冲流:
1. class MyBufferedReader extends Reader
2. {
3. Reader r;
4. public MyBufferedReader(Reader r)
5. {
6. this.r=r;
7. }
8. public String MyreadLine() throws IOException
9. {
10. StringBuilder s = new StringBuilder();
11. int c;
12. while((c=r.read())!=-1)
13. {
14. if(c=='\r')
15. continue;
16. if(c=='\n')
17. return s.toString();
18. s.append((char)c);
19. }
20. if(s.length()!=0)
21. return s.toString();
22. return null;
23. }
24. public void myclose() throws IOException
25. {
26. r.close();
27. }
28. @Override
29. public void close() throws IOException {
30. r.close();
31. }
32. @Override
33. public int read(char[] arg0, int arg1, int arg2) throws IOException {
34. return r.read(arg0, arg1, arg2);
35. }
二、单例设计模式
单例设计模式:解决一个类在内存只存在一个对象。就是保证对象的唯一性
1:饿汉式。
Single类一进内存,就已经创建好了对象。
class Single
{
private static Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}
2:懒汉式。
对象是方法被调用时,才初始化,也叫做对象的延时加载。Single类进内存,对像还有没有存在,只有调用了getInstance方法时,才建立对象。注意:懒汉式线程不安全,需要通过同步解决,但同步的效率低,所以使用双重判断提高效率。
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
s = new Single();
}
}
return s;
}
}
class MyBufferedReader extends Reader
{
Reader r;
public MyBufferedReader(Reader r)
{
this.r=r;
}
public String MyreadLine() throwsIOException
{
StringBuilder s = newStringBuilder();
int c;
while((c=r.read())!=-1)
{
if(c=='\r')
continue;
if(c=='\n')
return s.toString();
s.append((char)c);
}
if(s.length()!=0)
return s.toString();
return null;
}
public void myclose() throwsIOException
{
r.close();
}
@Override
public void close() throwsIOException {
r.close();
}
@Override
public int read(char[] arg0, intarg1, int arg2) throws IOException {
return r.read(arg0, arg1, arg2);
}
}
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------