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. Oracle 数据块损坏与恢复具体解释

    1.什么是块损坏: 所谓损坏的数据块,是指块没有採用可识别的 Oracle 格式,或者其内容在内部不一致. 通常情况下,损坏是由硬件故障或操作系统问题引起的.Oracle 数据库将损坏的块标识为&qu ...

  2. luogu1965 转圈游戏

    题目大意 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,--,依此 ...

  3. vim下很好的右键复制方法

    1)先按shift ,然后鼠标选中即可复制:(shift按下时为非vim环境) 2)好方法: "Enable and disable mouse use noremap <f1> ...

  4. 【Codeforces 258B】 Sort the Array

    [题目链接] http://codeforces.com/contest/451/problem/B [算法] 模拟 在序列中找到一段单调递增的子序列,将这段序列反转,然后判断序列是否变得单调递增,即 ...

  5. number随时间随机递增每天 不同 php(原创)

    <?php namespace Controller; class IndexController{ public function getAutoRegUserName(){ $sql=&qu ...

  6. [JavaEE] Spring学习资源链接

    学习规划 http://forrest-lv.iteye.com/blog/1166947 SpringMVC - 框架配置 http://blog.csdn.net/ljhabc1982/artic ...

  7. table合并单元格 colspan(跨列)和rowspan(跨行)

    colspan和rowspan这两个属性用于创建特殊的表格. colspan是“column span(跨列)”的缩写.colspan属性用在td标签中,用来指定单元格横向跨越的列数: 在浏览器中将显 ...

  8. CentOS6.5下nginx-1.8.1.tar.gz的单节点搭建(图文详解)

    不多说,直接上干货! [hadoop@djt002 local]$ su root Password: [root@djt002 local]# ll total drwxr-xr-x. root r ...

  9. 初探.net framework 下的异步多线程

    初探.net framework 下的异步多线程 目录 1.多线程的出现条件 2.Thread和ThreadPool的相关Api及用法 3.Task和Parallel的相关Api及用法 4.Async ...

  10. the selection cannot be run on any server

    导入war包后运行jsp 显示: the selection cannot be run on any server 问题原因: Dynamic Web Module 的版本与server不匹配.Dy ...