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. 《从零開始学Swift》学习笔记(Day 56)—— Swift编码规范之命名规范

    原创文章,欢迎转载.转载请注明:关东升的博客 程序代码中到处都是自定义的名字,取一个有样而且符合规范的名字非常重要. 命名方法非常多,可是比較有名的,广泛接受命名法有: 匈牙利命名,一般仅仅是命名变量 ...

  2. Eddy's picture

    Eddy's picture Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Tota ...

  3. Node.js:template

    ylbtech-Node.js: 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbtech ...

  4. Node.js:JXcore

    ylbtech-Node.js:JXcore 1.返回顶部 1. Node.js JXcore 打包 Node.js 是一个开放源代码.跨平台的.用于服务器端和网络应用的运行环境. JXcore 是一 ...

  5. Gym-101915A Printing Books 模拟

    题面 题意:给你N,X,   X表示这本书从X开始编号,每个X是几位数,计数器就加几, 然后问你如果从X,开始编号,计数器为N的时候,翻了几页,不能刚好为N输出-1. (例如,5 99,答案为2,因为 ...

  6. lhgdialog.js弹出框

    官方学习网址: http://www.lhgdialog.com/ 个人认为它的样式不太好调,除此之外它也是一款实用的弹出框,专业的用来提示文字,消息,按钮添加function().ifame: 以下 ...

  7. idea下的jsp开发中cannot resolve taglib with uri的解决方法

    写jsp难免会用到<c:foreach>标签,于是我在idea上的jsp顶头写下了 <%@ taglib prefix="c" uri= 'http://java ...

  8. lz的第一个RN项目

    这是lz 成功在原有项目上集成的第一个ReactNative 项目. 参考官方网址: http://reactnative.cn/docs/0.43/integration-with-existing ...

  9. Android拍照,录制视频,相机简单功能实现

    1.效果图,功能没有录制出来. 基本实现了拍照,录制视频,前后摄像头切换的功能,可以转屏,聚焦. 代码在最下面,可以看代码,运行apk看实际效果. 2.权限不能忘 <uses-permissio ...

  10. 得到Xml中 元素的值

    <?xml version="1.0" encoding="utf-8" ?><Response service="RouteSer ...