结合:
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. I/O中的 同步异步,阻塞非阻塞

    I/O中的同步和异步的概念和线程中不太一样. I/O写的时候,默认是写到页高速缓存就返回的,然后异步刷到磁盘上.而同步的I/O指的是改动写到磁盘上之后才会返回结果.可以通过fsync(),和fdata ...

  2. Ubuntu\Linux 下编写及调试C\C++

    一.在Ubuntu\Linux 下编写及调试C\C++需要配置基本的环境,即配置gcc编译器.安装vim编译器,具体配置安装步骤我在这里就不多说了. 二.基本环境配置完了我们就可以进入自己的程序编写了 ...

  3. fist-第一天随笔

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 这个作业要求在哪里 https://edu.cnblogs.com/campus/fz ...

  4. 20191012_WMI中可以看到有打印机, 设备管理器中没有

    开发过程中使用SELECT * FROM Win32_Printer 查看设备有一个备份打印机, 并且被设置为默认打印机了, 但是设备管理器中没有 解决方法: 使用系统自带的测试WMI  (Windo ...

  5. 【原创】Linux虚拟化KVM-Qemu分析(七)之timer虚拟化

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...

  6. 第7.3节 Python特色的面向对象设计:协议、多态及鸭子类型

    Python是一种多态语言,其表现特征是:对象方法的调用方只管方法是否可调用,不管对象是什么类型,从而屏蔽不同类型对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化. 一.    P ...

  7. 基于gin的golang web开发:服务间调用

    微服务开发中服务间调用的主流方式有两种HTTP.RPC,HTTP相对来说比较简单.本文将使用 Resty 包来实现基于HTTP的微服务调用. Resty简介 Resty 是一个简单的HTTP和REST ...

  8. Panda 交易所热点关注:股权交易中心+区块链试点将开始

    近期,Panda 交易所注意到,中国证监会已同意北京.上海等5家区域性股权市场参与区块链建设试点工作.Panda 交易所获悉的具体情况是,北京股权交易中心曾联合其他单位共同推出区域性股权市场中介机构征 ...

  9. 笔记-Recursive Queries

    Recursive Queries \[m_{l,r}=\textrm{id}(\max_{i=l}^r a_i)\\ f(l,r)= \begin{cases} (r-l+1)+f(l,m_{l,r ...

  10. linux的Umask 为022 和027 都是什么意思?

    用全部权限777去减这个数值 一.022表示默认创建新文件权限为755 也就是 rxwr-xr-x(所有者全部权限,属组读写,其它人读写)  二.027表示默认创建新文件权限为750 也就是rxwr- ...