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);
} }

Android设计模式(三)--装饰模式的更多相关文章

  1. Android设计模式系列

    http://www.cnblogs.com/qianxudetianxia/category/312863.html Android设计模式系列(12)--SDK源码之生成器模式(建造者模式) 摘要 ...

  2. Android动画 三种动画

    Android可以使用三种动画 Frame Animation-帧动画 ,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果 Tween Animation-补间动画,给出两个关键帧, ...

  3. 【转】Android LCD(三):Samsung LCD接口篇

    关键词:android LCD控制器 Framebuffer PWM  平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:samsung exynos ...

  4. 【转】android camera(三):camera V4L2 FIMC

    关键词:android  camera CMM 模组 camera参数  CAMIF   V4L2  平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos ...

  5. Android LCD(三):Samsung LCD接口篇

    关键词:android LCD控制器 Framebuffer PWM  平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0  平台:samsung exy ...

  6. 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)

    原文:乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) 作者:weba ...

  7. Android设计模式(五岁以下儿童)--简单工厂模式

    1.面试的时候问这个问题: 在ListView 的item小程序.很多不同的显示风格.或者是,为了更好地维护,不同的样式,应该怎么做? 我一下就想到的是工厂的模式,利用project,编写ViewFa ...

  8. Android 设计模式之MVC模式

    说到Android设计模式的MVC模式,估计很多人都是比较熟悉了,这里深入了解一下MVC到底是怎么回事,以ListView为例子讲解. 一.深入理解MVC概念 MVC即Model-View-Contr ...

  9. 8.4 GOF设计模式三: 外观模式 Facade

    GOF设计模式三: 外观模式 Facade  “现有系统”功能强大.复杂,开发“新系统”需要用到其中一部分,但又要增加一部 分新功能,该怎么办?4.1 Facade Pattern: Key Fea ...

  10. Android中三种超实用的滑屏方式汇总(转载)

    Android中三种超实用的滑屏方式汇总   现如今主流的Android应用中,都少不了左右滑动滚屏这项功能,(貌似现在好多人使用智能机都习惯性的有事没事的左右滑屏,也不知道在干什么...嘿嘿),由于 ...

随机推荐

  1. CentOS安装、配置APR和tomcat-native

    APR:Apache Portable Run-time libraries,Apache可移植执行库 在早期的Apache版本号中.应用程序本身必须可以处理各种详细操作系统平台的细节,并针对不同的平 ...

  2. 添加了click事件不响应

    https://stackoverflow.com/questions/18897807/on-click-event-on-td-created-dynamically 按照这个,给td添加clic ...

  3. discuz “欣” “衡” 用户不能注册 bug修改

    discuz “欣” “衡” 用户不能注册 原因是 discuz 有这样一段代码 function check_username($username) { $guestexp = '\xA1\xA1| ...

  4. centos 80端口占用

    netstat -lnp|grep 80 kill -9 1777        #杀掉编号为1777的进程(请根据实际情况输入)service httpd start #启动apache

  5. SwiftUI 官方教程(七)

    7. 给子 View 传递数据 LandmarkDetail 现在依然使用硬编码的数据来显示地标.像 LandmarkRow 一样,LandmarkDetail 类型和它组合的其他 view 都需要一 ...

  6. 【算法】Quick Select

    针对问题 找到一对无序的数中第  K  大,或者第 K 小的元素,返回该元素的值或者它的 index(index 的情况比较适合这堆数每个都独一无二的情况,不然可能会有多个答案). 关键思想 拿一个数 ...

  7. xBIM 基础02 快速入门

    系列目录    [已更新最新开发文章,点击查看详细]  一.新建项目 Visual Studio 新建项目.项目创建完成后 Nuget ,项目添加 Xbim.Essentials,那么如果项目需要几何 ...

  8. Keras简单使用

    Keras简单使用在keras中建立模型测试自己的图片一些有用的函数(持续更新) Keras简单使用 在keras中建立模型 相对于自己写机器学习相关的函数,keras更能快速搭建模型,流程如下: 通 ...

  9. ManualResetEvent和AutoResetEvent的区别,分享来的

    在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的.(这不是废话) 先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容, ...

  10. MongoDB 博客截图之二

    使用内置帮助help() 基本命令示例 来源:MongoDB基本管理命令 - 千与的专栏 - 博客频道 - CSDN.NET