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

    ---------------------- 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 



  • 相关阅读:
    angularjs的$on、$emit、$broadcast
    angularjs中的路由介绍详解 ui-route(转)
    ionic入门教程-ionic路由详解(state、route、resolve)(转)
    Cocos Creator 加载使用protobuf第三方库,因为加载顺序报错
    Cocos Creator 计时器错误 cc.Scheduler: Illegal target which doesn't have uuid or instanceId.
    Cocos Creator 构造函数传参警告 Can not instantiate CCClass 'Test' with arguments.
    Cocos Creator 对象池NodePool
    Cocos Creator 坐标系 (convertToWorldSpaceAR、convertToNodeSpaceAR)
    Cocos Creator 常驻节点addPersistRootNode
    Cocos Creator 配合Tiled地图的使用
  • 原文地址:https://www.cnblogs.com/shoneworn/p/5078120.html
Copyright © 2011-2022 走看看