Java设计模式从精通到入门二 装饰器模式
介绍
我尽量用最少的语言解释总结:
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设计模式从精通到入门二 装饰器模式的更多相关文章
- Java设计模式从精通到入门一 责任链模式
一直都想对设计模式有一个深刻的认识,这样对于阅读源码的时候就不会那么吃力了.于是有了想要记录下设计模式的笔记.打算从自己不怎么熟悉的设计模式开始写,里面穿插着一点自己的想法,希望自己写完后,会又一 ...
- Java设计模式从精通到入门四 工厂方法模式
工厂方法模式 属于23中设计模式中创建型类型. 核心思想:工厂提供创建对象的接口,由子类决定实例化哪一个子类. 来源 设计模式之禅中的例子,女娲造人,通过八卦炉来进行造人,没有烧熟的为白人,烧太熟 ...
- JAVA设计模式详解(三)----------装饰者模式
今天LZ带给大家的是装饰者模式,提起这个设计模式,LZ心里一阵激动,这是LZ学习JAVA以来接触的第一个设计模式,也许也是各位接触的第一个设计模式.记得当初老师在讲IO的时候就提到过它:“是你还有你, ...
- 设计模式入门之装饰器模式Decorator
//装饰模式定义:动态地给一个对象加入一些额外的职责. //就添加功能来说.装饰模式比生成子类更为灵活 //这也提现了面向对象设计中的一条基本原则,即:尽量使用对象组合,而不是对象继承 //Compo ...
- 《精通Python设计模式》学习结构型之装饰器模式
这只是实现了Python的装饰器模式. 其实,python的原生的装饰器的应用比这个要强,要广的. ''' known = {0:0, 1:1} def fibonacci(n): assert(n ...
- 设计模式PHP篇(三)————装饰器模式
简单的用php实现了装饰器模式: <?php /** *简单的装饰器模式 */ class PrintText { protected $decorators = []; public func ...
- Java设计模式从精通到入门五 抽象工厂方法模式
定义 抽象工厂类为创建一组相关和相互依赖的对象提供一组接口,而无需指定一个具体的类. 这里我得把工厂方法模式得定义拿出来做一下比较:定义一个创建对象的接口,由子类决定实例化哪一个类.工厂方法是一个 ...
- Java设计模式从精通到入门三 策略模式
介绍 我尽量用最少的语言解释总结: Java23种设计模式之一,属于行为型模式.一个类的行为或者算法可以在运行时更改,策略对象改变context对象执行算法. 应用实例: 以周瑜赔了夫人又折兵的例 ...
- Java函数接口实现函数组合及装饰器模式
摘要: 通过求解 (sinx)^2 + (cosx)^2 = 1 的若干写法,逐步展示了如何从过程式的写法转变到函数式的写法,并说明了编写"[接受函数参数]并返回[能够接受函数参数的函数]的 ...
随机推荐
- Database学习 - mysql 数据库 外键
外键 外键约束子表的含义:如果在父表中赵达不到候选键,则不允许在子表上进行insert/update 外键预约对父表的含义:在父表上进行update/delete以更新或删除子表中有一条或多条对应匹配 ...
- 2018-2019-2 网络对抗技术 20165227 Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165227 Exp3 免杀原理与实践 **免杀** - 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. - 要做好免杀,就 ...
- android logger 日志工具
https://github.com/orhanobut/logger 基础使用:https://blog.csdn.net/github_33304260/article/details/54799 ...
- 解决 ionic 中的 CORS(跨域)
译者注:本人翻译功力有限,所以文中难免有翻译不准确的地方,凑合看吧,牛逼的话你看英文版的去,完事儿欢迎回来指正交流(^_^) 如果你通过 ionic serve 或者 ionic run 命令使用或 ...
- springboot学习笔记-6 springboot整合RabbitMQ
一 RabbitMQ的介绍 RabbitMQ是消息中间件的一种,消息中间件即分布式系统中完成消息的发送和接收的基础软件.这些软件有很多,包括ActiveMQ(apache公司的),RocketMQ(阿 ...
- Python爬虫-爬取百度贴吧帖子
这次主要学习了替换各种标签,规范格式的方法.依然参考博主崔庆才的博客. 1.获取url 某一帖子:https://tieba.baidu.com/p/3138733512?see_lz=1&p ...
- 自助Linux之问题诊断工具strace【转】
转自:http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html 引言 “Oops,系统挂死了..." “Oops,程序 ...
- 如何在linux下检测内存泄漏(转)
本文转自:http://www.ibm.com/developerworks/cn/linux/l-mleak/ 本文针对 linux 下的 C++ 程序的内存泄漏的检测方法及其实现进行探讨.其中包括 ...
- 连接Linux服务器操作Oracle数据库
连接Linux服务器操作Oracle数据库 由于项目已经上线,现场的数据库服务器不允许直接用Oracle的客户端plsqldev.exe来连接,只能通过Linux服务器的命令来操作. 以下是用Se ...
- saltstack自动化运维系列⑤之saltstack的配置管理详解
saltstack自动化运维系列⑤之saltstack的配置管理详解 配置管理初始化: a.服务端配置vim /etc/salt/master file_roots: base: - /srv/sal ...