介绍

​ 我尽量用最少的语言解释总结:

​ Java23种设计模式之一,属于结构型模式,允许向一个现有的对象添加新的功能,不改变其结构。

应用实例:

​ 给英雄联盟种的射手,添加不同的装备。先装备攻速鞋,在装备电刀,最后装备无尽

uml类图如下

主要代码如下

ADC类:


/**
* @ClassName ADC
* @Description 英雄联盟射手
* @Author ouyangkang
* @Date 2018-11-13 08:49
**/
public interface ADC { /**
* @Author ouyangkang
* @Description ADC 必备好吧 攻击 和赢得胜利
* @Date 8:50 2018/11/13
* @param
* @return void
**/
void attack(); /**
* @Author ouyangkang
* @Description 补刀是一个射手必备的素质
* @Date 8:51 2018/11/13
* @param
* @return void
**/
void repairKnives();
}

VN这个射手类

/**
* @ClassName VN
* @Description 薇恩 em... 最喜欢的射手之一
* @Author ouyangkang
* @Date 2018-11-13 08:53
**/
public class VN implements ADC { @Override
public void attack() {
System.out.println("vn 发起了攻击。。。");
} @Override
public void repairKnives() {
System.out.println("vn 开始补刀。。。");
}
}

ADC 装备抽象类


/**
* @ClassName DecorateEquipment
* @Description ADC 的装备 抽象类 也就是抽象装饰
*
* 要实现这个射手的接口,并持有改接口的引用
* @Author ouyangkang
* @Date 2018-11-13 08:56
**/
public abstract class DecorateEquipment implements ADC{ private ADC adc; public DecorateEquipment(ADC adc){
this.adc = adc;
} @Override
public void repairKnives(){
this.adc.repairKnives();
} @Override
public void attack(){
this.adc.attack();
} }

功速鞋类


/**
* @ClassName SpeedShoe
* @Description 攻速鞋 这件装备
* @Author ouyangkang
* @Date 2018-11-13 09:08
**/
public class SpeedShoe extends DecorateEquipment {
public SpeedShoe(ADC adc) {
super(adc);
} @Override
public void repairKnives() {
// 装备着攻速鞋进行补刀
equipment();
super.repairKnives();
} @Override
public void attack() {
// 装备着攻速鞋进行团战 杀人
equipment();
super.attack();
} /**
* @Author ouyangkang
* @Description 装备
* @Date 9:03 2018/11/13
* @param
* @return void
**/
private void equipment(){
System.out.println("装备攻速鞋 提升攻速");
}
}

电刀类


/**
* @ClassName ElectricKnife
* @Description 电刀这件装备
* @Author ouyangkang
* @Date 2018-11-13 09:02
**/
public class ElectricKnife extends DecorateEquipment { public ElectricKnife(ADC adc) {
super(adc);
} @Override
public void repairKnives() {
// 装备着电刀进行补刀
equipment();
super.repairKnives();
} @Override
public void attack() {
// 装备着电刀进行团战 杀人
equipment();
super.attack();
} /**
* @Author ouyangkang
* @Description 装备
* @Date 9:03 2018/11/13
* @param
* @return void
**/
private void equipment(){
System.out.println("装备电刀这件武器。。。");
} }

无尽类


/**
* @ClassName EndLess
* @Description 无尽 这件装备
* @Author ouyangkang
* @Date 2018-11-13 09:22
**/
public class EndLess extends DecorateEquipment { public EndLess(ADC adc) {
super(adc);
} @Override
public void repairKnives() {
equipment();
super.repairKnives();
} @Override
public void attack() {
equipment();
super.attack();
} private void equipment(){
System.out.println("装备着无尽 提高暴击和攻击力");
}
}

测试类


/**
* @ClassName main
* @Description 创建一个射手 向下传递
* @Author ouyangkang
* @Date 2018-11-13 09:10
**/
public class main { public static void main(String[] args) {
// 创建一个射手
ADC vn = new VN(); // 第三 装无尽
vn = new EndLess(vn); // 第二 装电刀
vn = new ElectricKnife(vn); // 第一 装攻速鞋
vn = new SpeedShoe(vn);
vn.repairKnives();
System.out.println("-----------------------------");
vn.attack(); }
}

测试结果如下:

装备攻速鞋 提升攻速
装备电刀这件武器。。。
装备着无尽 提高暴击和攻击力
vn 开始补刀。。。
-----------------------------
装备攻速鞋 提升攻速
装备电刀这件武器。。。
装备着无尽 提高暴击和攻击力
vn 发起了攻击。。。

总结

​ 注意装饰抽象类需要实现你需要进行装备的对象。并持有改对象的引用。然后测试类种的对象都是向上传递。

Java设计模式从精通到入门二 装饰器模式的更多相关文章

  1. Java设计模式从精通到入门一 责任链模式

    ​ 一直都想对设计模式有一个深刻的认识,这样对于阅读源码的时候就不会那么吃力了.于是有了想要记录下设计模式的笔记.打算从自己不怎么熟悉的设计模式开始写,里面穿插着一点自己的想法,希望自己写完后,会又一 ...

  2. Java设计模式从精通到入门四 工厂方法模式

    工厂方法模式 属于23中设计模式中创建型类型. 核心思想:工厂提供创建对象的接口,由子类决定实例化哪一个子类. 来源 ​ 设计模式之禅中的例子,女娲造人,通过八卦炉来进行造人,没有烧熟的为白人,烧太熟 ...

  3. JAVA设计模式详解(三)----------装饰者模式

    今天LZ带给大家的是装饰者模式,提起这个设计模式,LZ心里一阵激动,这是LZ学习JAVA以来接触的第一个设计模式,也许也是各位接触的第一个设计模式.记得当初老师在讲IO的时候就提到过它:“是你还有你, ...

  4. 设计模式入门之装饰器模式Decorator

    //装饰模式定义:动态地给一个对象加入一些额外的职责. //就添加功能来说.装饰模式比生成子类更为灵活 //这也提现了面向对象设计中的一条基本原则,即:尽量使用对象组合,而不是对象继承 //Compo ...

  5. 《精通Python设计模式》学习结构型之装饰器模式

    这只是实现了Python的装饰器模式. 其实,python的原生的装饰器的应用比这个要强,要广的. ''' known = {0:0, 1:1} def fibonacci(n): assert(n ...

  6. 设计模式PHP篇(三)————装饰器模式

    简单的用php实现了装饰器模式: <?php /** *简单的装饰器模式 */ class PrintText { protected $decorators = []; public func ...

  7. Java设计模式从精通到入门五 抽象工厂方法模式

    定义 抽象工厂类为创建一组相关和相互依赖的对象提供一组接口,而无需指定一个具体的类. ​ 这里我得把工厂方法模式得定义拿出来做一下比较:定义一个创建对象的接口,由子类决定实例化哪一个类.工厂方法是一个 ...

  8. Java设计模式从精通到入门三 策略模式

    介绍 我尽量用最少的语言解释总结: Java23种设计模式之一,属于行为型模式.一个类的行为或者算法可以在运行时更改,策略对象改变context对象执行算法. 应用实例: ​ 以周瑜赔了夫人又折兵的例 ...

  9. Java函数接口实现函数组合及装饰器模式

    摘要: 通过求解 (sinx)^2 + (cosx)^2 = 1 的若干写法,逐步展示了如何从过程式的写法转变到函数式的写法,并说明了编写"[接受函数参数]并返回[能够接受函数参数的函数]的 ...

随机推荐

  1. Database学习 - mysql 数据库 外键

    外键 外键约束子表的含义:如果在父表中赵达不到候选键,则不允许在子表上进行insert/update 外键预约对父表的含义:在父表上进行update/delete以更新或删除子表中有一条或多条对应匹配 ...

  2. 2018-2019-2 网络对抗技术 20165227 Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165227 Exp3 免杀原理与实践 **免杀** - 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. - 要做好免杀,就 ...

  3. android logger 日志工具

    https://github.com/orhanobut/logger 基础使用:https://blog.csdn.net/github_33304260/article/details/54799 ...

  4. 解决 ionic 中的 CORS(跨域)

    译者注:本人翻译功力有限,所以文中难免有翻译不准确的地方,凑合看吧,牛逼的话你看英文版的去,完事儿欢迎回来指正交流(^_^) 如果你通过 ionic serve 或者 ionic run 命令使用或 ...

  5. springboot学习笔记-6 springboot整合RabbitMQ

    一 RabbitMQ的介绍 RabbitMQ是消息中间件的一种,消息中间件即分布式系统中完成消息的发送和接收的基础软件.这些软件有很多,包括ActiveMQ(apache公司的),RocketMQ(阿 ...

  6. Python爬虫-爬取百度贴吧帖子

    这次主要学习了替换各种标签,规范格式的方法.依然参考博主崔庆才的博客. 1.获取url 某一帖子:https://tieba.baidu.com/p/3138733512?see_lz=1&p ...

  7. 自助Linux之问题诊断工具strace【转】

    转自:http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html 引言 “Oops,系统挂死了..." “Oops,程序 ...

  8. 如何在linux下检测内存泄漏(转)

    本文转自:http://www.ibm.com/developerworks/cn/linux/l-mleak/ 本文针对 linux 下的 C++ 程序的内存泄漏的检测方法及其实现进行探讨.其中包括 ...

  9. 连接Linux服务器操作Oracle数据库

    连接Linux服务器操作Oracle数据库   由于项目已经上线,现场的数据库服务器不允许直接用Oracle的客户端plsqldev.exe来连接,只能通过Linux服务器的命令来操作. 以下是用Se ...

  10. saltstack自动化运维系列⑤之saltstack的配置管理详解

    saltstack自动化运维系列⑤之saltstack的配置管理详解 配置管理初始化: a.服务端配置vim /etc/salt/master file_roots: base: - /srv/sal ...