zoukankan      html  css  js  c++  java
  • Android设计模式(三)--装饰模式

    1、定义:

    Attach additional responsibilities to an object dynamically keeping the same interface. 
    Decoators provide a flexible alternative to subclassing for extending functionality.

    在不必改变原类文件和使用继承的情况下。动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。




    2、装饰模式。本质就是拓展,不改变原有的代码结构,利用setComponent()进行对象的封装,
    这样怎样使用这个对象就与对象的详细实现隔离开来。每一个装饰对象仅仅关心自己的功能,不须要关心是怎样加入到这个对象链中。


    3、为已有功能动态加入很多其它功能的方式


    4、动态的给对象加入一些额外的职责;


    5、比拓展继承与实现。更加灵活。


    6、把核心功能与装饰功能分离开来!



    普通情况下,我们普通的写法:

    package com.example.demo.decorator;
    
    /**
     * 装饰模式
     * 普通类
     * @author qubian
     * @data 2015年6月3日
     * @email naibbian@163.com
     *
     */
    public abstract class UserInfo {
    
    	public abstract String getName() ;
    	
    }
    

    package com.example.demo.decorator;
    
    /**
     * 普通的实现
     * @author qubian
     * @data 2015年6月3日
     * @email naibbian@163.com
     *
     */
    public class UserInfoImp extends UserInfo{
    
    	@Override
    	public String getName() {
    		
    		return "UserInfoImp";
    	}
    
    }
    
    

    如今開始拓展了;

    package com.example.demo.decorator;
    
    /**
     * 在不改变父类的情况下,
     * 进行对应的拓展
     * @author qubian
     * @data 2015年6月3日
     * @email naibbian@163.com
     *
     */
    public abstract class Decorator extends UserInfo{
    	
    	private UserInfo pattern;
    
    	public void SetComponent(UserInfo p)
    	{
    		pattern = p;
    	}
    	@Override
    	public String getName() {
    		StringBuilder name= new StringBuilder();
    		if (pattern!=null) {
    			name.append(pattern.getName());
    		}
    		return name.toString();
    	}
    }
    

    拓展的实现:
    package com.example.demo.decorator;
    
    /**
     * 拓展实现类
     * @author qubian
     * @data 2015年6月3日
     * @email naibbian@163.com
     *
     */
    public class DecoratorImp extends Decorator{
    
    	@Override
    	public String getName() {
    
    		StringBuilder sb = new StringBuilder();
    		sb.append(super.getName());
    		sb.append("DecoratorImp");
    		return sb.toString();
    	}
    	
    }
    

    详细使用:

    package com.example.demo.decorator;
    
    import android.util.Log;
    
    /**
     * 使用
     * @author qubian
     * @data 2015年6月3日
     * @email naibbian@163.com
     *
     */
    public class UseDecorator {
    	public static String TAG="UseDecorator";
    	
    	public void toUserDecorator()
    	{
    		//普通的使用
    		UserInfo dp = new UserInfoImp();
    		Log.i(TAG, dp.getName());
    		
    		//下面情况使用Decorator模式
    		//1. 须要扩展一个类的功能,或给一个类加入附加职责。
    		//2. 须要动态的给一个对象加入功能,这些功能能够再动态的撤销。

    //3. 须要添加由一些基本功能的排列组合而产生的很大量的功能,从而使继承关系变的不现实。

    //4. 当不能採用生成子类的方法进行扩充时。 //一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。 //还有一种情况可能是由于类定义被隐藏,或类定义不能用于生成子类。 DecoratorImp d = new DecoratorImp(); d.SetComponent(dp); Log.i(TAG, d.getName()); } }


    在Android framework 中,装饰模式也是运用广泛。

    參考了网上的一些资料;


    1、对于  Service Application Activity 均继承自  ContextWrapper ,而 ContextWrapper 实际上是对 Context 的装饰。

    2、是对WindowDecorator 是对Window的装饰,只是,临时对此没有对应的研究。先写上。以后研究。


    public class ContextWrapper extends Context {
        Context mBase;
    
        public ContextWrapper(Context base) {
            mBase = base;
        }
        
        /**
         * Set the base context for this ContextWrapper.  All calls will then be
         * delegated to the base context.  Throws
         * IllegalStateException if a base context has already been set.
         * 
         * @param base The new base context for this wrapper.
         */
        protected void attachBaseContext(Context base) {
            if (mBase != null) {
                throw new IllegalStateException("Base context already set");
            }
            mBase = base;
        }
    
        /**
         * @return the base context as set by the constructor or setBaseContext
         */
        public Context getBaseContext() {
            return mBase;
        }
    
        @Override
        public AssetManager getAssets() {
            return mBase.getAssets();
        }
    
        @Override
        public Resources getResources()
        {
            return mBase.getResources();
        }
    
        @Override
        public PackageManager getPackageManager() {
            return mBase.getPackageManager();
        }
    
        @Override
        public ContentResolver getContentResolver() {
            return mBase.getContentResolver();
        }
    
        @Override
        public Looper getMainLooper() {
            return mBase.getMainLooper();
        }
        
        @Override
        public Context getApplicationContext() {
            return mBase.getApplicationContext();
        }
        
        @Override
        public void setTheme(int resid) {
            mBase.setTheme(resid);
        }
    
      
        }







  • 相关阅读:
    php接收二进制文件转换成图片
    浅述WinForm多线程编程与Control.Invoke的应用
    精典策略模式
    js数组的操作详解
    PHP常用类
    收藏:五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
    在 Windows 上部署 Qt 应用程序
    解决 MinGW5.14 编译 QT4.4.3 报错的问题
    懒人制作 deb 包
    NET 自定义配置文件 Configuration
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8458947.html
Copyright © 2011-2022 走看看