Android 装饰者模式初探

前提

最近刚换了一份工作,这段时间一直在熟悉公司的代码逻辑,从中受益颇多。里面的设计模式也挺多的,运用的那个潇洒飘逸,让我好生羡慕。自己对设计模式这块理解的不是特别的深入,能拿出手的也就那么几个,刚好最近也学习了一些设计模式。所以,在这里斗胆写一下关于设计模式的文章,一方面是加深记忆,一方面是做一下总结。如果有不对的地方还请各位指正。

首先

1、 定义
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。
2、 介绍

  • 装饰者模式是一种结构模式
  • 装饰者模式的运用挺广的,举一个不太恰当的例子。比如花,花有颜色,有寓意也有花语。如果是花的花语是:“我足以与你相配”并且寓意是:“天真、纯洁、尊敬、父爱”,那么她就是白玫瑰。如果花的花语是:“莫离 幸福,就是你属于我”,寓意是:“清纯,贞洁,质朴,玲珑”,那么她就是白茉莉。
  • 通常我们扩展类的功能是通过继承的方式来实现,但是装饰者模式是通过组合的方式来实现,这是继承的替代方案之一。

3、角色说明:

  • Component(抽象组件):接口或者抽象类,被装饰的最原始的对象。具体组件与抽象装饰角色的父类。
  • ConcreteComponent(具体组件):实现抽象组件的接口。
  • Decorator(抽象装饰角色):一般是抽象类,抽象组件的子类,同时持有一个被装饰者的引用,用来调用被装饰者的方法;同时可以给被装饰者增加新的职责。
  • ConcreteDecorator(具体装饰类):抽象装饰角色的具体实现。

其次

原理讲了那么多,也许有的人对于枯燥的原理早都没有好感了(我能说我看到原理很头疼吗?),下面用一个实例来给大家讲解一番,就以花举例。

  • 创建抽象组件
    这里是一个抽象花类,定义一个装修的方法:

    public abstract class Flower {
     //装饰方法(显示颜色)
    public abstract void showColor();
    }
    
  • 创建具体组件
    这里是一个具体花类,并且给花定义了寓意

    public class SpecificFlower extends  Flower{
    
    
    private static final String TAG=SpecificFlower.class.getSimpleName();
    
    @Override
    public void showColor() {
      Log.e(TAG,"花开花落花有时");
     }
    
    }
    
  • 创建抽象装饰角色
    要为花定义颜色寓意等,定义抽象的花的装饰类:

    public abstract class FlowerDecorator extends Flower {
    
    Flower mFlower;
    
    public FlowerDecorator(Flower mFlower) {
      this.mFlower = mFlower;
    }
    
    @Override
    public void showColor() {
      mFlower.showColor();
    }
    
    /**
     * 显示感情(寓意)
     */
    public void showEmotion(){
    
    }
    }
    
  • 创建具体的装饰类

我们要定义不同的花(白玫瑰和白茉莉),那么他们的寓意和花语也是不同的,下面具体实现是不同的:

/**
 * 
 * 具体装饰类(白玫瑰)
 */
  public class WhiteRose extends FlowerDecorator {

  private static final String TAG=SpecificFlower.class.getSimpleName();

  public WhiteRose(Flower mFlower) {
    super(mFlower);
  }

  @Override
  public void showColor() {
    super.showColor();
    Log.e(TAG,"我是白玫瑰,我的花语是:我足以与你相配");

  }

  @Override
  public void showEmotion() {
    super.showEmotion();
    Log.e(TAG,"我是白玫瑰,我的寓意是:天真、纯洁、尊敬、父爱");
  }
}

 /**
 * 
 * 具体装饰类(白茉莉)
 */

public class WhiteMolly extends FlowerDecorator {

private static final String TAG=SpecificFlower.class.getSimpleName();

public WhiteMolly(Flower mFlower) {
    super(mFlower);
}

@Override
public void showColor() {
    super.showColor();
    Log.e(TAG,"我是白茉莉,我的花语是:莫离 幸福,就是你属于我");
}

@Override
public void showEmotion() {
    super.showEmotion();
    Log.e(TAG,"我是白茉莉,我的寓意是:清纯,贞洁,质朴,玲珑 ");
 }
}
  • 调用实现(使用)

     Flower flower=new SpecificFlower();
     FlowerDecorator flowerDecorator= new WhiteMolly(flower);
     flowerDecorator.showColor();
     flowerDecorator.showEmotion();
     FlowerDecorator mFlower= new WhiteRose(flower);
     mFlower.showColor();
     mFlower.showEmotion();
    
  • 打印日志

    装饰者模式日志.png
  • 应用场景
    需要扩展一个类的功能,或给一个类增加附加功能时
    需要动态的给一个对象增加功能,这些功能可以再动态的撤销
    当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。

  • 优点
    采用组合的方式,可以动态的扩展功能,同时也可以在运行时选择不同的装饰器,来实现不同的功能。
    有效避免了使用继承的方式扩展对象功能而带来的灵活性差,子类无限制扩张的问题。
    被装饰者与装饰者解偶,被装饰者可以不知道装饰者的存在,同时新增功能时原有代码也无需改变,符合开放封闭原则。

  • 缺点
    装饰层过多的话,维护起来比较困难。
    如果要修改抽象组件这个基类的话,后面的一些子类可能也需跟着修改,较容易出错,装饰者模式虽好,切不可贪杯,用的太多,不容易处理。

最后

上面就是小可最近所学到的设计模式,如果有不对的地方还请给我大佬指正提点。源码就是文中所列出来的这些,如果需要尝试,复制粘贴即可实现。

感谢

Android的设计模式-装饰者模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容

  • 本文首发于个人博客:Lam's Blog - 谈谈23种设计模式在Android源码及项目中的应用,文章由Mark...
    格子林ll阅读 4,615评论 1 105
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,573评论 18 139
  • 这会儿在回家的路上,几乎是回家的末班车了,到家也要半夜了,宝贝,妈妈一定要赶上你的毕业典礼哦,虽然只是一个小小的幼...
    吴佟阅读 182评论 1 1
  • 主要的效率分析指标有 每股盈余 每股股利 股利保障倍数 股利支付率 市盈率 股票收益率 资本周转率 销售费用率
    Winona0930阅读 563评论 0 0
  • 是否,因为一首歌,潸然泪下 是否,因为一个人,辗转反侧 每一首让你潸然泪下的歌 背后都有一个只属于你的故事 故事的...
    因为我是雨辰啊阅读 173评论 0 1