结合:
Android设计模式 006 装饰者模式  【B站】对整个重构的细节讲的容易懂
Android的设计模式-装饰者模式   【简书】结合安卓源码讲的还可以,让我对context有更深入的理解


1.模式定义
    动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码&减少子类个数)。--《设计模式》GoF

2.动机

  • 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。
  • 如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响降为最低?

3.要点总结

  • 通过采用组合而非继承的手法,Decorator模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了使用继承带来的“灵活性差”和“多子类衍生问题”。
  • Decorator类在接口上表现为is-a Component的继承关系(继承+组合),即Decorator类继承了Component类所具有的接口。但在实现上又表现为has-a Component的组合关系,即Decorator类又使用了另外一个Component类。
  • Decorator模式的目的并非解决“多子类衍生的多继承”问题,Decorator模式应用的要点在于解决“主体类在多个方向上扩展功能”--是为“装饰”的含义。

4.uml类图

5.实现

以绝地求生中枪械为例

5.1抽象枪械

public abstract class Gun {
public abstract void load();//装子弹 public abstract void fire();//发射子弹
}

5.2具体枪械

98k 和m416
public class Gun98K extends Gun {
@Override
public void load() {
Log.e("Gun98K", "装满5发子弹");
} @Override
public void fire() {
Log.e("Gun98K", "开始点射");
}
}
public class GunM416 extends Gun {

    @Override
public void load() {
Log.e("GunM416", "装子弹");
} @Override
public void fire() {
Log.e("GunM416", "开始扫射");
}
}

5.3抽象装饰器

public abstract class GunDecorator extends Gun {
Gun gun; public GunDecorator(Gun gun) {
this.gun = gun;
} @Override
public void load() {
gun.load();
} @Override
public void fire() {
gun.fire();
}
}

5.4具体装饰器

/**
* Describe: 加枪托
*/
public class ButtGunDecorator extends GunDecorator {
String butt; public ButtGunDecorator(Gun gun, String butt) {
super(gun);
this.butt = butt;
} @Override
public void load() {
gun.load();
} @Override
public void fire() {
Log.e("ButtGun", "降低垂直水平后坐力");
gun.fire();
}
}
/**
* Created by nbb on 2020/12/26
* Version 1.0
* Describe:子弹袋装饰
*/
public class BulletBagGunDecorator extends GunDecorator { String sight; public BulletBagGunDecorator(Gun gun, String sight) {
super(gun);
this.sight = sight;
} @Override
public void load() {
Log.e("BulletBagGunDecorator", sight + "快速");
gun.load();
} @Override
public void fire() {
gun.fire();
}
}
/**
* Created by nbb on 2020/12/26
* Version 1.0
* Describe:瞄具
*/
public class SightGunDecorator extends GunDecorator { String sight; public SightGunDecorator(Gun gun, String sight) {
super(gun);
this.sight = sight;
} @Override
public void load() {
gun.load();
} @Override
public void fire() {
Log.e("SightGun", sight + "打开 放大目标");
gun.fire();
}
}

5.5测试

  	Gun m416 = new GunM416();//捡到一把M4
Gun sightM416 = new SightGunDecorator(m416, "4倍镜");//捡到一个4倍镜
Gun buttSightM416 = new ButtGunDecorator(sightM416, "M416枪托");//捡到一个枪托 buttSightM416.load();
buttSightM416.fire(); //捡到一把满配98K
Gun gun98k = new SightGunDecorator(new BulletBagGunDecorator(new Gun98K(),
"98k子弹袋"),"8倍镜");
gun98k.load();
gun98k.fire();
//结果
// GunM416: 装子弹
// ButtGun: 降低垂直水平后坐力
// SightGun: 4倍镜打开 放大目标
// GunM416: 开始扫射 // BulletBagGunDecorator: 98k子弹袋快速
// Gun98K: 装满5发子弹
// SightGun: 8倍镜打开 放大目标
// Gun98K: 开始点射



5.装饰模式 Decorator (单一职责)的更多相关文章

  1. 设计模式---单一职责模式之装饰模式(Decorator)

    前提:"单一职责"模式 在软件组件的设计中,如果责任划分的不清晰,使用继承,得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任 典型模式(表现 ...

  2. C++设计模式 之 “单一职责”模式:Decorator、Bridge

    part 1 “单一职责”模式 在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任. 典型模式 Decorato ...

  3. 23种设计模式 - 单一职责(Decorator - Bridge)

    其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 单一职责 在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀, ...

  4. 设计模式---单一职责模式之桥模式(Bridge)

    一:概念 Bridge模式又叫做桥接模式,其实基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任他的主要特点是吧抽象与行为实现分离开来,从而可以保持各部分的独立性以及一对 ...

  5. 学习记录:《C++设计模式——李建忠主讲》4.“单一职责”模式

    单一职责模式:在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任. 典型模式:装饰模式(Decorator).桥 ...

  6. 二十四种设计模式:装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern) 介绍动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活.示例有一个Message实体类,某个对象对它的操作有Insert()和 ...

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

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

  8. 设计模式 装饰模式(Decorator)

    设计模式 装饰模式(Decorator) @author ixenos 装饰模式是什么 1.装饰模式以对客户端透明的方式对象的功能,是继承关系的一个替代方案,但装饰模式可以在不创造更多子类的情况下,对 ...

  9. 设计模式-装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活

  10. 设计模式-09装饰模式(Decorator Pattern)

    1.模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制:使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是 ...

随机推荐

  1. Java基础教程——打印流

    打印流 打印流可以把原本输出到控制台的信息输出到文件中.PrintStream是字节打印流(还有个对应的字符打印流是PrintWriter,这里不涉及) System类中有个变量: public fi ...

  2. Java基础教程——System类

    System类 java.lang.System类代表当前Java程序的运行平台. |-可以做输入输出,垃圾回收:(此处不讲) |-可以获取时间: |-可以获取环境变量: |-可以获取系统信息: |- ...

  3. Java 关于策略模式+简单工厂模式下的思考

    导读 最近在做公司一个消息网关的服务,包括:短信.微信.邮件等,所有请求通过一个入口,方便接口的管理(记录日志.接口限流白名单啥的).如何写这个接口呢,还有为了以后扩展,对接过短信.微信.公众号的童鞋 ...

  4. C#:终于有人把 ValueTask、IValueTaskSource、ManualResetValueTaskSourceCore 说清楚了!

    目录 1,可用版本与参考资料 2,ValueTask 和 Task 3,编译器如何编译 4,ValueTask 有什么优势 5,ValueTask 创建异步任务 6,IValueTaskSource ...

  5. Java 安全之Java Agent

    Java 安全之Java Agent 0x00 前言 在前面发现很多技术都会去采用Java Agent该技术去做实现,比分说RASP和内存马(其中一种方式).包括IDEA的这些破解都是基于Java A ...

  6. vue-父子组件传参以及无限级评论

    vue父子组件的使用 <template> <div> <zi :data="data" /> </div> </templa ...

  7. 第4.4节 Python解析与推导:列表解析、字典解析、集合解析

    一.    引言 经过前几个章节的介绍,终于把与列表解析的前置内容介绍完了,本节老猿将列表解析.字典解析.集合解析进行统一的介绍. 前面章节老猿好几次说到了要介绍列表解析,但老猿认为涉及知识层面比较多 ...

  8. moviepy音视频剪辑:音视频的加载和输出

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 在本地进行音视频处理时,首先要从视频文件 ...

  9. 老猿学5G扫盲贴:PDU协议数据单元、PDU连接业务和PDU会话的功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.PDU 关于PDU在百度百科是这样定义的:协议 ...

  10. 安卓学习02---room

    title: 安卓学习02---room date: 2020-02-02 18:20:13 tags: room是jetpack的组件,可以使程序流畅的访问sqlite. <!--more - ...