• 黑马程序员:装饰类的作用——增强被装饰类的方法的功能(利用组合实现复用)


    ---------------------- java+android开发android培训、期待与您交流! ----------------------

     装饰类,的特点在于灵活,高效,可以避免复杂的类的继承体系。

    装饰类,在疯狂java讲义的5.8.2节出,叫做利用组合实现复用。可以作为参考。

    /*
    MyReader --专门用于读取数据的类
        |--MyTextReader
    		|--MyBufferedTextReader  
    	|--MyMediaReader 
    		|--MyBufferedMediaReader  
    	|--MyDataReader    //后续可能还需要增加的类
    		|--MyBufferedDataReader
    //为了提高读取速度和效率,引入缓冲区,所以按照上面的逻辑,需要引入多个类来完成各自的缓冲,结构复杂,效率低
    
    可以用一般的装饰类
    class MyBufferedReader
    {
        MyBufferedReader( MyTextReader text)
    	{}
    	MyBufferedReader( MyMediaReader media)
    	{}
    	MyBufferedReader( MyDataReader data)
    	{}
    	//这么做还是开销大,体系复杂。扩展性很差
    
    }
    
    上面这个类的扩展性很差
    找到其参数的共同类型,通过多态的形式,可以提高扩展性
    class MyBufferedReader extends MyReader
    {
    <span style="white-space:pre">	</span>private MyReader r;
    <span style="white-space:pre">	</span>MyBufferedReader(MyReader r)
    <span style="white-space:pre">	</span>{}
    
    
    }
    
    这个时候,结构为:
    MyReader --专门用于读取数据的类
    	|--MyTextReader
    	|--MyMediaReader
    	|--MyDataReader
    	|--MyBufferedReader   
    
    
    
    <pre code_snippet_id="406366" snippet_file_name="blog_20140626_1_4508160" class="html" name="code">装饰模式比继承要灵活,避免了继承体系臃肿
    而且,降低了类与类之间的关系
    
    
    装饰类因为增强已有对象,具备的功能呢和已有的是相同的,只不过,提供了更强的功能。
    所以,装饰类和被装饰类通常是都属于一个体系中
    
    <span style="font-family: Arial, Helvetica, sans-serif;">*/</span>


    </pre>
    
    
    
    
    /*
    装饰类设计模式:
    当想要对已有的对象进行功能增强时
    可以定义类。将已有的对象传入,基于已有的功能,并提供加强功能。
    那么自定义的该类为装饰类。
    装饰类通常会通过构造方法接受被装饰的对象。并基于被装饰对象的功能提供更强的功能。
    
    */
    
    class Person 
    {
    
    	public void chifan()
    	{
    		System.out.println("吃饭");
    
    	}
    
    }
    
    
    class SuperPerson
    {
    	private Person p;
    	SuperPerson(Person p )
    	{
    		this.p = p;
    	}
    
    	public void SuperChiFan()
    	{
    		System.out.println("开胃酒");
    		p.chifan();
    		System.out.println("吃饭");
    		System.out.println("喝汤");
    	}
    }
    
    
    
    
    class  PersonDemo
    {
    		public static void main(String[] args) 
    	{
    		Person p= new Person();
    		SuperPerson sp = new SuperPerson(p);
    		sp.SuperChiFan();
    
    	}
    	
    }
    
    
    


    ---------------------- java+android开发android培训、期待与您交流! ----------------------详细请查看:www.itheima.com 



  • 相关阅读:
    不要在构造中做太多事情,不然有时候会出现有意思的代码~
    对称加密和非对称加密
    关于WebAPI安全认证的问题
    Dojo和jQuery区别
    跨域访问解决方案:JSONP
    MyEclipse中提示SpringMVC的XML配置文件出错解决方法
    什么是跨域请求
    Hadoop的初步理解
    数据库读写分离的初步理解
    前端渲染和后端渲染
  • 原文地址:https://www.cnblogs.com/shoneworn/p/5078120.html
Copyright © 2020-2023  润新知