装饰和单例设计模式

黑马程序员

                       装饰和单例设计模式

------- <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>、期待与您交流! ----------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值