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();
-
打印日志
应用场景
需要扩展一个类的功能,或给一个类增加附加功能时
需要动态的给一个对象增加功能,这些功能可以再动态的撤销
当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。优点
采用组合的方式,可以动态的扩展功能,同时也可以在运行时选择不同的装饰器,来实现不同的功能。
有效避免了使用继承的方式扩展对象功能而带来的灵活性差,子类无限制扩张的问题。
被装饰者与装饰者解偶,被装饰者可以不知道装饰者的存在,同时新增功能时原有代码也无需改变,符合开放封闭原则。缺点
装饰层过多的话,维护起来比较困难。
如果要修改抽象组件这个基类的话,后面的一些子类可能也需跟着修改,较容易出错,装饰者模式虽好,切不可贪杯,用的太多,不容易处理。
最后
上面就是小可最近所学到的设计模式,如果有不对的地方还请给我大佬指正提点。源码就是文中所列出来的这些,如果需要尝试,复制粘贴即可实现。
感谢
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android音频管理之AudioManager(原创)
本文已独家授权 郭霖 ( guolin_blog) 公众号发布! 本篇文章主要介绍的是Android应用(WebView加载H5的音频管理只是其中的一种)如何有效管理或定制音频的基本内容和一些思路。 事情的起因是这样的,最近接到个需求WebView加载H5游戏,嗯,霹雳巴拉一顿猛敲基本上就搞定了,针对8.1系统也做了一些适配。好了,验货的时间到了,产品用他那傲娇的手指一顿操作后不耐烦的说,这个应用为什么按下HOME键后(Back键禁用了 - - !)游戏还有声音???当时我在想,目标Activity生命周期 onResume()和onPause()不是写了对应的 myWebView.onResume();以及 myWebView.onPause()的啊啊!难不成那厮又在戏剧性耍我? 带着黑人小哥头上3个问号表情的我说到,按下HOME键没有声音的嘛,我先试试。产品瞬间反转谄媚一笑说到,下午可以搞定嘛?我说,这个声音可能是H5游戏引擎技术的问题,我先看下什么问题。然后,就是老套路编译代码打开应用插上耳机,进入游戏BGM时间,按下HOME键,MMP,声音真没消失!!! 好了,遇到问题后我跟大...
- 下一篇
苹果WWDC与谷歌I/O开发者大会谁更有影响力 ?
摘要: 一年一度的Google I/O和WWDC均已结束,两个开发者大会的关注重点都在系统之上,并都致力于开发统一平台。那么,从桌面和移动操作系统、智能手表、音乐、地图到数据中心基础设施等,Google和Apple究竟谁更胜一筹? Google I/O和Apple WWDC是开发者们的两大盛宴,因为往往在会议期间两家科技巨头都会带来历年的最新产品、技术以及对未来的展望。今天我就来带大家PK一下谷歌和苹果在历年的开发者大会中,谁更能引领科技发展。 Google I/O 简史 Google I/O是由谷歌举行的开发者年会,设计的内容从最初的开放网络技术开发网络应用发展到现在的智能硬件和云端服务.Google I/O大会以前的名字为 Google Developer Day,分别在 2006 及 2007 举行, 所以我们熟悉的开发者大会沿用了下来。然后Google I/O 这名字是有含义的:I = Innovation,O = Open,另一方面,一个程式员第一件事要学的,也是电脑的 I/O : I = Input,O = Output。 Apple WWDC 简史 WWDC – Ap...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2全家桶,快速入门学习开发网站教程
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装